diff --git a/.gitignore b/.gitignore index 849cda5..a8a51bc 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ sass_processed node_modules/ package-lock.json +/src diff --git a/chat_box/asgi.py b/chat_box/asgi.py deleted file mode 100644 index 6044bc8..0000000 --- a/chat_box/asgi.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -ASGI entrypoint. Configures Django and then runs the application -defined in the ASGI_APPLICATION setting. -""" - -import os -import django -from channels.routing import get_default_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dmoj.settings") -django.setup() -application = get_default_application() diff --git a/chat_box/consumers.py b/chat_box/consumers.py deleted file mode 100644 index cb7cd18..0000000 --- a/chat_box/consumers.py +++ /dev/null @@ -1,76 +0,0 @@ -import json -from channels.generic.websocket import AsyncWebsocketConsumer -from .models import Message -from django.urls import reverse -from django.http import HttpResponse, HttpResponseRedirect -from django.core import serializers - -from judge.jinja2.gravatar import gravatar -from judge.models.profile import Profile - - -class ChatConsumer(AsyncWebsocketConsumer): - async def connect(self): - self.room_name = 'room' - self.room_group_name = 'chat_%s' % self.room_name - - # Join room group - await self.channel_layer.group_add( - self.room_group_name, - self.channel_name, - ) - - await self.accept() - - async def disconnect(self, close_code): - # Leave room group - await self.channel_layer.group_discard( - self.room_group_name, - self.channel_name, - ) - - # Receive message from WebSocket - async def receive(self, text_data): - text_data_json = json.loads(text_data) - message = text_data_json['message'] - - author = self.scope['user'] - author = Profile.objects.get(user=author) - - message['author'] = author.username - message['css_class'] = author.css_class - message['image'] = gravatar(author, 32) - - message_saved = save_data_and_return(message, author) - message['time'] = message_saved[0]['fields']['time'] - message['id'] = message_saved[0]['pk'] - - # Send message to room group - await self.channel_layer.group_send( - self.room_group_name, - { - 'type': 'chat_message', - 'message': message, - }, - ) - - # Receive message from room group - async def chat_message(self, event): - message = event['message'] - # Send message to WebSocket - await self.send(text_data=json.dumps({ - 'message': message, - })) - - -# return time -def save_data_and_return(message, author): - new_message = Message(body=message['body'], - author=author, - ) - new_message.save() - json_data = serializers.serialize("json", - Message.objects - .filter(pk=new_message.id) - ) - return json.loads(json_data) \ No newline at end of file diff --git a/chat_box/migrations/0005_auto_20211011_0714.py b/chat_box/migrations/0005_auto_20211011_0714.py new file mode 100644 index 0000000..eaf26cb --- /dev/null +++ b/chat_box/migrations/0005_auto_20211011_0714.py @@ -0,0 +1,28 @@ +# Generated by Django 2.2.17 on 2021-10-11 00:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0116_auto_20211011_0645'), + ('chat_box', '0004_auto_20200505_2336'), + ] + + operations = [ + migrations.CreateModel( + name='Room', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_one', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_one', to='judge.Profile', verbose_name='user 1')), + ('user_two', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_two', to='judge.Profile', verbose_name='user 2')), + ], + ), + migrations.AddField( + model_name='message', + name='room', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='chat_box.Room', verbose_name='room id'), + ), + ] diff --git a/chat_box/migrations/0006_userroom.py b/chat_box/migrations/0006_userroom.py new file mode 100644 index 0000000..eff219c --- /dev/null +++ b/chat_box/migrations/0006_userroom.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.17 on 2021-11-12 05:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0116_auto_20211011_0645'), + ('chat_box', '0005_auto_20211011_0714'), + ] + + operations = [ + migrations.CreateModel( + name='UserRoom', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('last_seen', models.DateTimeField(verbose_name='last seen')), + ('room', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='chat_box.Room', verbose_name='room id')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Profile', verbose_name='user')), + ], + ), + ] diff --git a/chat_box/migrations/0007_auto_20211112_1255.py b/chat_box/migrations/0007_auto_20211112_1255.py new file mode 100644 index 0000000..49a39f0 --- /dev/null +++ b/chat_box/migrations/0007_auto_20211112_1255.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.17 on 2021-11-12 05:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('chat_box', '0006_userroom'), + ] + + operations = [ + migrations.AlterField( + model_name='userroom', + name='last_seen', + field=models.DateTimeField(auto_now_add=True, verbose_name='last seen'), + ), + ] diff --git a/chat_box/migrations/0008_ignore.py b/chat_box/migrations/0008_ignore.py new file mode 100644 index 0000000..723dd3b --- /dev/null +++ b/chat_box/migrations/0008_ignore.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.17 on 2021-11-18 10:26 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0116_auto_20211011_0645'), + ('chat_box', '0007_auto_20211112_1255'), + ] + + operations = [ + migrations.CreateModel( + name='Ignore', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ignored_users', models.ManyToManyField(to='judge.Profile')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ignored_chat_users', to='judge.Profile', verbose_name='user')), + ], + ), + ] diff --git a/chat_box/models.py b/chat_box/models.py index 315073f..5958347 100644 --- a/chat_box/models.py +++ b/chat_box/models.py @@ -1,5 +1,3 @@ -from asgiref.sync import async_to_sync -from channels.layers import get_channel_layer from django.db import models from django.db.models import CASCADE from django.utils.translation import gettext_lazy as _ @@ -10,12 +8,23 @@ from judge.models.profile import Profile __all__ = ['Message'] +class Room(models.Model): + user_one = models.ForeignKey(Profile, related_name="user_one", verbose_name='user 1', on_delete=CASCADE) + user_two = models.ForeignKey(Profile, related_name="user_two", verbose_name='user 2', on_delete=CASCADE) + + def contain(self, profile): + return self.user_one == profile or self.user_two == profile + def other_user(self, profile): + return self.user_one if profile == self.user_two else self.user_two + def users(self): + return [self.user_one, self.user_two] class Message(models.Model): author = models.ForeignKey(Profile, verbose_name=_('user'), on_delete=CASCADE) time = models.DateTimeField(verbose_name=_('posted time'), auto_now_add=True) body = models.TextField(verbose_name=_('body of comment'), max_length=8192) hidden = models.BooleanField(verbose_name='is hidden', default=False) + room = models.ForeignKey(Room, verbose_name='room id', on_delete=CASCADE, default=None, null=True) def save(self, *args, **kwargs): new_message = self.id @@ -27,3 +36,49 @@ class Message(models.Model): verbose_name = 'message' verbose_name_plural = 'messages' ordering = ('-time',) + +class UserRoom(models.Model): + user = models.ForeignKey(Profile, verbose_name=_('user'), on_delete=CASCADE) + room = models.ForeignKey(Room, verbose_name='room id', on_delete=CASCADE, default=None, null=True) + last_seen = models.DateTimeField(verbose_name=_('last seen'), auto_now_add=True) + + +class Ignore(models.Model): + user = models.ForeignKey(Profile, related_name="ignored_chat_users", verbose_name=_('user'), on_delete=CASCADE) + ignored_users = models.ManyToManyField(Profile) + + @classmethod + def is_ignored(self, current_user, new_friend): + try: + return current_user.ignored_chat_users.get().ignored_users \ + .filter(id=new_friend.id).exists() + except: + return False + + @classmethod + def get_ignored_users(self, user): + try: + return self.objects.get(user=user).ignored_users.all() + except Ignore.DoesNotExist: + return Profile.objects.none() + + @classmethod + def add_ignore(self, current_user, friend): + ignore, created = self.objects.get_or_create( + user = current_user + ) + ignore.ignored_users.add(friend) + + @classmethod + def remove_ignore(self, current_user, friend): + ignore, created = self.objects.get_or_create( + user = current_user + ) + ignore.ignored_users.remove(friend) + + @classmethod + def toggle_ignore(self, current_user, friend): + if (self.is_ignored(current_user, friend)): + self.remove_ignore(current_user, friend) + else: + self.add_ignore(current_user, friend) \ No newline at end of file diff --git a/chat_box/routing.py b/chat_box/routing.py deleted file mode 100644 index a91c8ad..0000000 --- a/chat_box/routing.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.urls import re_path - -from . import consumers - -ASGI_APPLICATION = "chat_box.routing.application" -websocket_urlpatterns = [ - re_path(r'ws/chat/', consumers.ChatConsumer), -] diff --git a/chat_box/utils.py b/chat_box/utils.py new file mode 100644 index 0000000..5ebb16e --- /dev/null +++ b/chat_box/utils.py @@ -0,0 +1,18 @@ +from cryptography.fernet import Fernet + +from django.conf import settings + +secret_key = settings.CHAT_SECRET_KEY +fernet = Fernet(secret_key) + +def encrypt_url(creator_id, other_id): + message = str(creator_id) + '_' + str(other_id) + return fernet.encrypt(message.encode()).decode() + +def decrypt_url(message_encrypted): + try: + dec_message = fernet.decrypt(message_encrypted.encode()).decode() + creator_id, other_id = dec_message.split('_') + return int(creator_id), int(other_id) + except Exception as e: + return None, None \ No newline at end of file diff --git a/chat_box/views.py b/chat_box/views.py index 486051c..2ed2bb7 100644 --- a/chat_box/views.py +++ b/chat_box/views.py @@ -1,79 +1,99 @@ from django.utils.translation import gettext as _ from django.views.generic import ListView -from django.http import HttpResponse, JsonResponse +from django.http import HttpResponse, JsonResponse, HttpResponseBadRequest, HttpResponsePermanentRedirect, HttpResponseRedirect from django.core.paginator import Paginator +from django.core.exceptions import PermissionDenied from django.shortcuts import render from django.forms.models import model_to_dict +from django.db.models import Case, BooleanField, When, Q, Subquery, OuterRef, Exists, Count, IntegerField +from django.db.models.functions import Coalesce from django.utils import timezone +from django.contrib.auth.decorators import login_required +from django.urls import reverse +import datetime +from judge import event_poster as event from judge.jinja2.gravatar import gravatar -from .models import Message, Profile +from judge.models import Friend + +from chat_box.models import Message, Profile, Room, UserRoom, Ignore +from chat_box.utils import encrypt_url, decrypt_url + import json - -def format_messages(messages): - msg_list = [{ - 'time': msg.time, - 'author': msg.author, - 'body': msg.body, - 'image': gravatar(msg.author, 32), - 'id': msg.id, - 'css_class': msg.author.css_class, - } for msg in messages] - return json.dumps(msg_list, default=str) -def get_admin_online_status(): - all_admin = Profile.objects.filter(display_rank='admin') - last_five_minutes = timezone.now()-timezone.timedelta(minutes=5) - ret = [] - - for admin in all_admin: - is_online = False - if (admin.last_access >= last_five_minutes): - is_online = True - ret.append({'user': admin, 'is_online': is_online}) - - return ret class ChatView(ListView): - model = Message context_object_name = 'message' template_name = 'chat/chat.html' title = _('Chat Box') - paginate_by = 50 - paginator = Paginator(Message.objects.filter(hidden=False), paginate_by) + + def __init__(self): + super().__init__() + self.room_id = None + self.room = None + self.paginate_by = 50 + self.messages = None + self.paginator = None def get_queryset(self): - return Message.objects.filter(hidden=False) + return self.messages def get(self, request, *args, **kwargs): + request_room = kwargs['room_id'] page = request.GET.get('page') - if (page == None): - # return render(request, 'chat/chat.html', {'message': format_messages(Message.objects.all())}) + + if request_room: + try: + self.room = Room.objects.get(id=request_room) + if not can_access_room(request, self.room): + return HttpResponseBadRequest() + except Room.DoesNotExist: + return HttpResponseBadRequest() + else: + request_room = None + + if request_room != self.room_id or not self.messages: + self.room_id = request_room + self.messages = Message.objects.filter(hidden=False, room=self.room_id) + self.paginator = Paginator(self.messages, self.paginate_by) + + if page == None: + update_last_seen(request, **kwargs) return super().get(request, *args, **kwargs) cur_page = self.paginator.get_page(page) - return HttpResponse(format_messages(cur_page.object_list)) + + return render(request, 'chat/message_list.html', { + 'object_list': cur_page.object_list, + 'num_pages': self.paginator.num_pages + }) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - # hard code, should be fixed later - address = f'{self.request.get_host()}/ws/chat/' - if self.request.is_secure(): - context['ws_address'] = f'wss://{address}' - else: - context['ws_address'] = f'ws://{address}' - context['title'] = self.title - last_five_minutes = timezone.now()-timezone.timedelta(minutes=5) - context['online_users'] = Profile.objects \ - .filter(display_rank='user', - last_access__gte = last_five_minutes)\ - .order_by('-rating') - context['admin_status'] = get_admin_online_status() + context['last_msg'] = event.last() + context['status_sections'] = get_status_context(self.request) + context['room'] = self.room_id + context['unread_count_lobby'] = get_unread_count(None, self.request.profile) + if self.room: + users_room = [self.room.user_one, self.room.user_two] + users_room.remove(self.request.profile) + context['other_user'] = users_room[0] + context['other_online'] = get_user_online_status(context['other_user']) + context['is_ignored'] = Ignore.is_ignored(self.request.profile, context['other_user']) + else: + context['online_count'] = get_online_count() + context['message_template'] = { + 'author': self.request.profile, + 'id': '$id', + 'time': timezone.now(), + 'body': '$body' + } return context + def delete_message(request): ret = {'delete': 'done'} @@ -81,17 +101,352 @@ def delete_message(request): return JsonResponse(ret) if request.user.is_staff: - messid = int(request.POST.get('messid')) - all_mess = Message.objects.all() + try: + messid = int(request.POST.get('message')) + mess = Message.objects.get(id=messid) + except: + return HttpResponseBadRequest() - for mess in all_mess: - if mess.id == messid: - mess.hidden = True - mess.save() - new_elt = {'time': mess.time, 'content': mess.body} - ret = new_elt - break + mess.hidden = True + mess.save() return JsonResponse(ret) return JsonResponse(ret) + + +@login_required +def post_message(request): + ret = {'msg': 'posted'} + if request.method != 'POST': + return HttpResponseBadRequest() + + room = None + if request.POST['room']: + room = Room.objects.get(id=request.POST['room']) + + if not can_access_room(request, room) or request.profile.mute: + return HttpResponseBadRequest() + + new_message = Message(author=request.profile, + body=request.POST['body'], + room=room) + new_message.save() + + if not room: + event.post('chat_lobby', { + 'type': 'lobby', + 'author_id': request.profile.id, + 'message': new_message.id, + 'room': 'None', + 'tmp_id': request.POST.get('tmp_id') + }) + else: + for user in room.users(): + event.post('chat_' + str(user.id), { + 'type': 'private', + 'author_id': request.profile.id, + 'message': new_message.id, + 'room': room.id, + 'tmp_id': request.POST.get('tmp_id') + }) + + return JsonResponse(ret) + + +def can_access_room(request, room): + return not room or room.user_one == request.profile or room.user_two == request.profile + + +@login_required +def chat_message_ajax(request): + if request.method != 'GET': + return HttpResponseBadRequest() + + try: + message_id = request.GET['message'] + except KeyError: + return HttpResponseBadRequest() + + try: + message = Message.objects.filter(hidden=False).get(id=message_id) + room = message.room + if room and not room.contain(request.profile): + return HttpResponse('Unauthorized', status=401) + except Message.DoesNotExist: + return HttpResponseBadRequest() + return render(request, 'chat/message.html', { + 'message': message, + }) + + +@login_required +def update_last_seen(request, **kwargs): + if 'room_id' in kwargs: + room_id = kwargs['room_id'] + elif request.method == 'GET': + room_id = request.GET.get('room') + elif request.method == 'POST': + room_id = request.POST.get('room') + else: + return HttpResponseBadRequest() + + try: + profile = request.profile + room = None + if room_id: + room = Room.objects.get(id=int(room_id)) + except Room.DoesNotExist: + return HttpResponseBadRequest() + except Exception as e: + return HttpResponseBadRequest() + + if room and not room.contain(profile): + return HttpResponseBadRequest() + + user_room, _ = UserRoom.objects.get_or_create(user=profile, room=room) + user_room.last_seen = timezone.now() + user_room.save() + + return JsonResponse({'msg': 'updated'}) + + +def get_online_count(): + last_two_minutes = timezone.now()-timezone.timedelta(minutes=2) + return Profile.objects.filter(last_access__gte=last_two_minutes).count() + + +def get_user_online_status(user): + time_diff = timezone.now() - user.last_access + is_online = time_diff <= timezone.timedelta(minutes=2) + return is_online + + +def user_online_status_ajax(request): + if request.method != 'GET': + return HttpResponseBadRequest() + + user_id = request.GET.get('user') + + if user_id: + try: + user_id = int(user_id) + user = Profile.objects.get(id=user_id) + except Exception as e: + return HttpResponseBadRequest() + + is_online = get_user_online_status(user) + return render(request, 'chat/user_online_status.html', { + 'other_user': user, + 'other_online': is_online, + 'is_ignored': Ignore.is_ignored(request.profile, user) + }) + else: + return render(request, 'chat/user_online_status.html', { + 'online_count': get_online_count(), + }) + + +def get_online_status(request_user, queryset, rooms=None): + if not queryset: + return None + last_two_minutes = timezone.now()-timezone.timedelta(minutes=2) + ret = [] + + if rooms: + unread_count = get_unread_count(rooms, request_user) + count = {} + for i in unread_count: + count[i['other_user']] = i['unread_count'] + + for user in queryset: + is_online = False + if (user.last_access >= last_two_minutes): + is_online = True + user_dict = {'user': user, 'is_online': is_online} + if rooms and user.id in count: + user_dict['unread_count'] = count[user.id] + user_dict['url'] = encrypt_url(request_user.id, user.id) + ret.append(user_dict) + return ret + + +def get_status_context(request, include_ignored=False): + if include_ignored: + ignored_users = Profile.objects.none() + queryset = Profile.objects + else: + ignored_users = Ignore.get_ignored_users(request.profile) + queryset = Profile.objects.exclude(id__in=ignored_users) + + last_two_minutes = timezone.now()-timezone.timedelta(minutes=2) + recent_profile = Room.objects.filter( + Q(user_one=request.profile) | Q(user_two=request.profile) + ).annotate( + last_msg_time=Subquery( + Message.objects.filter(room=OuterRef('pk')).values('time')[:1] + ), + other_user=Case( + When(user_one=request.profile, then='user_two'), + default='user_one', + ) + ).filter(last_msg_time__isnull=False)\ + .exclude(other_user__in=ignored_users)\ + .order_by('-last_msg_time').values('other_user', 'id')[:20] + + recent_profile_id = [str(i['other_user']) for i in recent_profile] + joined_id = ','.join(recent_profile_id) + recent_rooms = [int(i['id']) for i in recent_profile] + recent_list = None + if joined_id: + recent_list = Profile.objects.raw( + f'SELECT * from judge_profile where id in ({joined_id}) order by field(id,{joined_id})') + friend_list = Friend.get_friend_profiles(request.profile).exclude(id__in=recent_profile_id)\ + .exclude(id__in=ignored_users)\ + .order_by('-last_access') + admin_list = queryset.filter(display_rank='admin')\ + .exclude(id__in=friend_list).exclude(id__in=recent_profile_id) + all_user_status = queryset\ + .filter(display_rank='user', + last_access__gte = last_two_minutes)\ + .annotate(is_online=Case(default=True,output_field=BooleanField()))\ + .order_by('-rating').exclude(id__in=friend_list).exclude(id__in=admin_list)\ + .exclude(id__in=recent_profile_id)[:30] + + return [ + { + 'title': 'Recent', + 'user_list': get_online_status(request.profile, recent_list, recent_rooms), + }, + { + 'title': 'Following', + 'user_list': get_online_status(request.profile, friend_list), + }, + { + 'title': 'Admin', + 'user_list': get_online_status(request.profile, admin_list), + }, + { + 'title': 'Other', + 'user_list': get_online_status(request.profile, all_user_status), + }, + ] + + +@login_required +def online_status_ajax(request): + return render(request, 'chat/online_status.html', { + 'status_sections': get_status_context(request), + 'unread_count_lobby': get_unread_count(None, request.profile), + }) + + +@login_required +def get_room(user_one, user_two): + if user_one.id > user_two.id: + user_one, user_two = user_two, user_one + room, created = Room.objects.get_or_create(user_one=user_one, user_two=user_two) + return room + + +@login_required +def get_or_create_room(request): + if request.method == 'GET': + decrypted_other_id = request.GET.get('other') + elif request.method == 'POST': + decrypted_other_id = request.POST.get('other') + else: + return HttpResponseBadRequest() + + request_id, other_id = decrypt_url(decrypted_other_id) + + if not other_id or not request_id or request_id != request.profile.id: + return HttpResponseBadRequest() + + try: + other_user = Profile.objects.get(id=int(other_id)) + except Exception: + return HttpResponseBadRequest() + + user = request.profile + + if not other_user or not user: + return HttpResponseBadRequest() + # TODO: each user can only create <= 300 rooms + room = get_room(other_user, user) + for u in [other_user, user]: + user_room, _ = UserRoom.objects.get_or_create(user=u, room=room) + user_room.last_seen = timezone.now() + user_room.save() + + if request.method == 'GET': + return JsonResponse({'room': room.id, 'other_user_id': other_user.id}) + return HttpResponseRedirect(reverse('chat', kwargs={'room_id': room.id})) + + +def get_unread_count(rooms, user): + if rooms: + mess = Message.objects.filter(room=OuterRef('room'), + time__gte=OuterRef('last_seen'))\ + .exclude(author=user)\ + .order_by().values('room')\ + .annotate(unread_count=Count('pk')).values('unread_count') + + return UserRoom.objects\ + .filter(user=user, room__in=rooms)\ + .annotate( + unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), + other_user=Case( + When(room__user_one=user, then='room__user_two'), + default='room__user_one', + ) + ).filter(unread_count__gte=1).values('other_user', 'unread_count') + else: # lobby + mess = Message.objects.filter(room__isnull=True, + time__gte=OuterRef('last_seen'))\ + .exclude(author=user)\ + .order_by().values('room')\ + .annotate(unread_count=Count('pk')).values('unread_count') + + res = UserRoom.objects\ + .filter(user=user, room__isnull=True)\ + .annotate( + unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), + ).values_list('unread_count', flat=True) + + return res[0] if len(res) else 0 + + +@login_required +def toggle_ignore(request, **kwargs): + user_id = kwargs['user_id'] + if not user_id: + return HttpResponseBadRequest() + try: + other_user = Profile.objects.get(id=user_id) + except: + return HttpResponseBadRequest() + + Ignore.toggle_ignore(request.profile, other_user) + next_url = request.GET.get('next', '/') + return HttpResponseRedirect(next_url) + + +@login_required +def get_unread_boxes(request): + if (request.method != 'GET'): + return HttpResponseBadRequest() + + mess = Message.objects.filter(room=OuterRef('room'), + time__gte=OuterRef('last_seen'))\ + .exclude(author=request.profile)\ + .order_by().values('room')\ + .annotate(unread_count=Count('pk')).values('unread_count') + + unread_boxes = UserRoom.objects\ + .filter(user=request.profile, room__isnull=False)\ + .annotate( + unread_count=Coalesce(Subquery(mess, output_field=IntegerField()), 0), + ).filter(unread_count__gte=1).count() + + return JsonResponse({'unread_boxes': unread_boxes}) \ No newline at end of file diff --git a/dmoj/routing.py b/dmoj/routing.py deleted file mode 100644 index 72e0379..0000000 --- a/dmoj/routing.py +++ /dev/null @@ -1,12 +0,0 @@ -from channels.auth import AuthMiddlewareStack -from channels.routing import ProtocolTypeRouter, URLRouter -import chat_box.routing - -application = ProtocolTypeRouter({ - # (http->django views is added by default) - 'websocket': AuthMiddlewareStack( - URLRouter( - chat_box.routing.websocket_urlpatterns - ) - ), -}) \ No newline at end of file diff --git a/dmoj/settings.py b/dmoj/settings.py index 4967ee7..86377a7 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -72,7 +72,7 @@ DMOJ_BLOG_NEW_PROBLEM_COUNT = 7 DMOJ_BLOG_NEW_CONTEST_COUNT = 7 DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT = 7 DMOJ_TOTP_TOLERANCE_HALF_MINUTES = 1 -DMOJ_USER_MAX_ORGANIZATION_COUNT = 3 +DMOJ_USER_MAX_ORGANIZATION_COUNT = 10 DMOJ_COMMENT_VOTE_HIDE_THRESHOLD = -5 DMOJ_PDF_PROBLEM_CACHE = '' DMOJ_PDF_PROBLEM_TEMP_DIR = tempfile.gettempdir() @@ -125,6 +125,10 @@ SLIMERJS_PAPER_SIZE = 'Letter' PUPPETEER_MODULE = '/usr/lib/node_modules/puppeteer' PUPPETEER_PAPER_SIZE = 'Letter' +USE_SELENIUM = False +SELENIUM_CUSTOM_CHROME_PATH = None +SELENIUM_CHROMEDRIVER_PATH = 'chromedriver' + PYGMENT_THEME = 'pygment-github.css' INLINE_JQUERY = True INLINE_FONTAWESOME = True @@ -239,8 +243,8 @@ INSTALLED_APPS += ( 'impersonate', 'django_jinja', 'chat_box', - 'channels', 'newsletter', + 'django.forms', ) MIDDLEWARE = ( @@ -263,6 +267,8 @@ MIDDLEWARE = ( 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', ) +FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' + IMPERSONATE_REQUIRE_SUPERUSER = True IMPERSONATE_DISABLE_LOGGING = True @@ -484,6 +490,8 @@ SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.user.user_details', ) +SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['first_name', 'last_name'] +SOCIAL_AUTH_GOOGLE_OAUTH2_USER_FIELDS = ['email', 'username'] SOCIAL_AUTH_GITHUB_SECURE_SCOPE = ['user:email'] SOCIAL_AUTH_FACEBOOK_SCOPE = ['email'] SOCIAL_AUTH_SLUGIFY_USERNAMES = True @@ -495,11 +503,6 @@ 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 TESTCASE_VISIBLE_LENGTH = 64 @@ -509,17 +512,6 @@ FILE_UPLOAD_PERMISSIONS = 0o644 MESSAGES_TO_LOAD = 15 -ASGI_APPLICATION = 'dmoj.routing.application' -CHANNEL_LAYERS = { - 'default': { - 'BACKEND': 'channels_redis.core.RedisChannelLayer', - 'CONFIG': { - "hosts": [('0.0.0.0', 6379)], - }, - }, -} - - NEWSLETTER_CONFIRM_EMAIL = False # Amount of seconds to wait between each email. Here 100ms is used. @@ -529,4 +521,13 @@ NEWSLETTER_EMAIL_DELAY = 0.1 NEWSLETTER_BATCH_DELAY = 60 # Number of emails in one batch -NEWSLETTER_BATCH_SIZE = 100 \ No newline at end of file +NEWSLETTER_BATCH_SIZE = 100 + +# Google form to request name +REGISTER_NAME_URL = None + +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/urls.py b/dmoj/urls.py index 1573c4b..a7b6d82 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -1,4 +1,5 @@ -from chat_box.views import ChatView, delete_message +from chat_box.views import * + from django.conf import settings from django.conf.urls import include, url from django.contrib import admin @@ -21,10 +22,10 @@ from judge.views import TitledTemplateView, about, api, blog, comment, contests, notification, 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 + problem_data_file, problem_init_view, ProblemZipUploadView from judge.views.register import ActivationView, RegistrationView -from judge.views.select2 import AssigneeSelect2View, CommentSelect2View, ContestSelect2View, \ - ContestUserSearchSelect2View, OrganizationSelect2View, ProblemSelect2View, TicketUserSelect2View, \ +from judge.views.select2 import AssigneeSelect2View, ChatUserSearchSelect2View, CommentSelect2View, \ + ContestSelect2View, ContestUserSearchSelect2View, OrganizationSelect2View, ProblemSelect2View, TicketUserSelect2View, \ UserSearchSelect2View, UserSelect2View admin.autodiscover() @@ -115,6 +116,7 @@ urlpatterns = [ 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'^/comments$', problem.ProblemComments.as_view(), name='problem_comments'), 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'), @@ -131,6 +133,7 @@ urlpatterns = [ 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'^/test_data/upload$', ProblemZipUploadView.as_view(), name='problem_zip_upload'), url(r'^/data/(?P.+)$', problem_data_file, name='problem_data_file'), url(r'^/tickets$', ticket.ProblemTicketListView.as_view(), name='problem_ticket_list'), @@ -225,6 +228,9 @@ urlpatterns = [ url(r'^/participation/disqualify$', contests.ContestParticipationDisqualify.as_view(), name='contest_participation_disqualify'), + url(r'^/clarification$', contests.NewContestClarificationView.as_view(), name='new_contest_clarification'), + url(r'^/clarification/ajax$', contests.ContestClarificationAjax.as_view(), name='contest_clarification_ajax'), + url(r'^/$', lambda _, contest: HttpResponsePermanentRedirect(reverse('contest_view', args=[contest]))), ])), @@ -284,6 +290,7 @@ urlpatterns = [ url(r'^select2/', include([ url(r'^user_search$', UserSearchSelect2View.as_view(), name='user_search_select2_ajax'), + url(r'^user_search_chat$', ChatUserSearchSelect2View.as_view(), name='chat_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'), @@ -369,16 +376,28 @@ urlpatterns = [ url(r'^custom_checker_sample/', about.custom_checker_sample, name='custom_checker_sample'), url(r'^chat/', include([ - url(r'^$', - login_required(ChatView.as_view()), - name='chat'), - url(r'^delete/$', delete_message, name='delete_message') - + url(r'^(?P\d*)$', login_required(ChatView.as_view()), name='chat'), + url(r'^delete/$', delete_message, name='delete_chat_message'), + url(r'^post/$', post_message, name='post_chat_message'), + url(r'^ajax$', chat_message_ajax, name='chat_message_ajax'), + url(r'^online_status/ajax$', online_status_ajax, name='online_status_ajax'), + url(r'^get_or_create_room$', get_or_create_room, name='get_or_create_room'), + url(r'^update_last_seen$', update_last_seen, name='update_last_seen'), + url(r'^online_status/user/ajax$', user_online_status_ajax, name='user_online_status_ajax'), + url(r'^toggle_ignore/(?P\d+)$', toggle_ignore, name='toggle_ignore'), + url(r'^get_unread_boxes$', get_unread_boxes, name='get_unread_boxes'), ])), url(r'^notifications/', login_required(notification.NotificationList.as_view()), - name='notification') + name='notification'), + + url(r'^import_users/', include([ + url(r'^$', user.ImportUsersView.as_view(), name='import_users'), + url(r'post_file/$', user.import_users_post_file, name='import_users_post_file'), + url(r'submit/$', user.import_users_submit, name='import_users_submit'), + url(r'sample/$', user.sample_import_users, name='import_users_sample') + ])), ] favicon_paths = ['apple-touch-icon-180x180.png', 'apple-touch-icon-114x114.png', 'android-chrome-72x72.png', @@ -389,7 +408,7 @@ favicon_paths = ['apple-touch-icon-180x180.png', 'apple-touch-icon-114x114.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'] + 'apple-touch-icon-120x120.png', 'mstile-310x310.png', 'reload.png'] for favicon in favicon_paths: urlpatterns.append(url(r'^%s$' % favicon, RedirectView.as_view( diff --git a/judge/admin/contest.py b/judge/admin/contest.py index f815016..8678281 100644 --- a/judge/admin/contest.py +++ b/judge/admin/contest.py @@ -7,10 +7,12 @@ 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 import timezone from django.utils.html import format_html from django.utils.translation import gettext_lazy as _, ungettext from reversion.admin import VersionAdmin +from django_ace import AceWidget from judge.models import Contest, ContestProblem, ContestSubmission, Profile, Rating from judge.ratings import rate_contest from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, AdminPagedownWidget, \ @@ -94,7 +96,9 @@ class ContestForm(ModelForm): class Meta: widgets = { - 'organizers': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), + 'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), + 'curators': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), + 'testers': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), 'private_contestants': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), 'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2'), @@ -111,18 +115,19 @@ class ContestForm(ModelForm): class ContestAdmin(VersionAdmin): fieldsets = ( - (None, {'fields': ('key', 'name', 'organizers')}), - (_('Settings'), {'fields': ('is_visible', 'use_clarifications', 'hide_problem_tags', 'hide_scoreboard', + (None, {'fields': ('key', 'name', 'authors', 'curators', 'testers')}), + (_('Settings'), {'fields': ('is_visible', 'use_clarifications', 'hide_problem_tags', 'scoreboard_visibility', 'run_pretests_only', 'points_precision')}), (_('Scheduling'), {'fields': ('start_time', 'end_time', 'time_limit')}), (_('Details'), {'fields': ('description', 'og_image', 'logo_override_image', 'tags', 'summary')}), - (_('Format'), {'fields': ('format_name', 'format_config')}), + (_('Format'), {'fields': ('format_name', 'format_config', 'problem_label_script')}), (_('Rating'), {'fields': ('is_rated', 'rate_all', 'rating_floor', 'rating_ceiling', 'rate_exclude')}), (_('Access'), {'fields': ('access_code', 'is_private', 'private_contestants', 'is_organization_private', 'organizations', 'view_contest_scoreboard')}), (_('Justice'), {'fields': ('banned_users',)}), ) list_display = ('key', 'name', 'is_visible', 'is_rated', 'start_time', 'end_time', 'time_limit', 'user_count') + search_fields = ('key', 'name') inlines = [ContestProblemInline] actions_on_top = True actions_on_bottom = True @@ -146,7 +151,7 @@ class ContestAdmin(VersionAdmin): if request.user.has_perm('judge.edit_all_contest'): return queryset else: - return queryset.filter(organizers__id=request.profile.id) + return queryset.filter(Q(authors=request.profile) | Q(curators=request.profile)).distinct() def get_readonly_fields(self, request, obj=None): readonly = [] @@ -158,6 +163,8 @@ class ContestAdmin(VersionAdmin): readonly += ['is_private', 'private_contestants', 'is_organization_private', 'organizations'] if not request.user.has_perm('judge.change_contest_visibility'): readonly += ['is_visible'] + if not request.user.has_perm('judge.contest_problem_label'): + readonly += ['problem_label_script'] return readonly def save_model(self, request, obj, form, change): @@ -185,9 +192,9 @@ class ContestAdmin(VersionAdmin): 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: + if obj is None: return True - return obj.organizers.filter(id=request.profile.id).exists() + return obj.is_editable_by(request.user) def _rescore(self, contest_key): from judge.tasks import rescore_contest @@ -232,14 +239,10 @@ class ContestAdmin(VersionAdmin): 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() + with connection.cursor() as 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'): + for contest in Contest.objects.filter(is_rated=True, end_time__lte=timezone.now()).order_by('end_time'): rate_contest(contest) return HttpResponseRedirect(reverse('admin:judge_contest_changelist')) @@ -247,16 +250,21 @@ class ContestAdmin(VersionAdmin): if not request.user.has_perm('judge.contest_rating'): raise PermissionDenied() contest = get_object_or_404(Contest, id=id) - if not contest.is_rated: + if not contest.is_rated or not contest.ended: 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) + def get_form(self, request, obj=None, **kwargs): + form = super(ContestAdmin, self).get_form(request, obj, **kwargs) + if 'problem_label_script' in form.base_fields: + # form.base_fields['problem_label_script'] does not exist when the user has only view permission + # on the model. + form.base_fields['problem_label_script'].widget = AceWidget('lua', request.profile.ace_theme) + perms = ('edit_own_contest', 'edit_all_contest') - form.base_fields['organizers'].queryset = Profile.objects.filter( + form.base_fields['curators'].queryset = Profile.objects.filter( Q(user__is_superuser=True) | Q(user__groups__permissions__codename__in=perms) | Q(user__user_permissions__codename__in=perms), @@ -274,7 +282,7 @@ class ContestParticipationForm(ModelForm): class ContestParticipationAdmin(admin.ModelAdmin): fields = ('contest', 'user', 'real_start', 'virtual', 'is_disqualified') - list_display = ('contest', 'username', 'show_virtual', 'real_start', 'score', 'cumtime') + list_display = ('contest', 'username', 'show_virtual', 'real_start', 'score', 'cumtime', 'tiebreaker') actions = ['recalculate_results'] actions_on_bottom = actions_on_top = True search_fields = ('contest__key', 'contest__name', 'user__user__username') @@ -284,7 +292,7 @@ class ContestParticipationAdmin(admin.ModelAdmin): 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', + 'user__user__username', 'real_start', 'score', 'cumtime', 'tiebreaker', 'virtual', ) def save_model(self, request, obj, form, change): diff --git a/judge/apps.py b/judge/apps.py index 068889e..96ec022 100644 --- a/judge/apps.py +++ b/judge/apps.py @@ -30,7 +30,7 @@ class JudgeAppConfig(AppConfig): from django.contrib.auth.models import User try: - lang = Language.get_python3() + lang = Language.get_default_language() for user in User.objects.filter(profile=None): # These poor profileless users profile = Profile(user=user, language=lang) diff --git a/judge/comments.py b/judge/comments.py index 6e7c7e6..7408e68 100644 --- a/judge/comments.py +++ b/judge/comments.py @@ -80,8 +80,10 @@ class CommentedDetailView(TemplateResponseMixin, SingleObjectMixin, View): 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')) + if self.request.user.has_perm('judge.override_comment_lock'): + return False + return (CommentLock.objects.filter(page=self.get_comment_page()).exists() + or (self.request.in_contest and self.request.participation.contest.use_clarifications)) @method_decorator(login_required) def post(self, request, *args, **kwargs): diff --git a/judge/contest_format/__init__.py b/judge/contest_format/__init__.py index c602e4d..ee57ccf 100644 --- a/judge/contest_format/__init__.py +++ b/judge/contest_format/__init__.py @@ -1,5 +1,6 @@ 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.icpc import ICPCContestFormat 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 index cad4e97..28b188d 100644 --- a/judge/contest_format/atcoder.py +++ b/judge/contest_format/atcoder.py @@ -91,6 +91,7 @@ class AtCoderContestFormat(DefaultContestFormat): participation.cumtime = cumtime + penalty participation.score = points + participation.tiebreaker = 0 participation.format_data = format_data participation.save() diff --git a/judge/contest_format/base.py b/judge/contest_format/base.py index 7fcadc3..d4e6e6f 100644 --- a/judge/contest_format/base.py +++ b/judge/contest_format/base.py @@ -82,6 +82,14 @@ class BaseContestFormat(six.with_metaclass(ABCMeta)): """ raise NotImplementedError() + @abstractmethod + def get_contest_problem_label_script(self): + """ + Returns the default Lua script to generate contest problem labels. + :return: A string, the Lua script. + """ + raise NotImplementedError() + @classmethod def best_solution_state(cls, points, total): if not points: diff --git a/judge/contest_format/default.py b/judge/contest_format/default.py index 690cdfc..532102d 100644 --- a/judge/contest_format/default.py +++ b/judge/contest_format/default.py @@ -41,6 +41,7 @@ class DefaultContestFormat(BaseContestFormat): participation.cumtime = max(cumtime, 0) participation.score = points + participation.tiebreaker = 0 participation.format_data = format_data participation.save() @@ -68,3 +69,10 @@ class DefaultContestFormat(BaseContestFormat): def get_problem_breakdown(self, participation, contest_problems): return [(participation.format_data or {}).get(str(contest_problem.id)) for contest_problem in contest_problems] + + def get_contest_problem_label_script(self): + return ''' + function(n) + return tostring(math.floor(n + 1)) + end + ''' \ No newline at end of file diff --git a/judge/contest_format/ecoo.py b/judge/contest_format/ecoo.py index ff1060a..1199826 100644 --- a/judge/contest_format/ecoo.py +++ b/judge/contest_format/ecoo.py @@ -92,6 +92,7 @@ class ECOOContestFormat(DefaultContestFormat): participation.cumtime = cumtime participation.score = points + participation.tiebreaker = 0 participation.format_data = format_data participation.save() diff --git a/judge/contest_format/icpc.py b/judge/contest_format/icpc.py new file mode 100644 index 0000000..e858a6c --- /dev/null +++ b/judge/contest_format/icpc.py @@ -0,0 +1,129 @@ +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('icpc') +class ICPCContestFormat(DefaultContestFormat): + name = gettext_lazy('ICPC') + config_defaults = {'penalty': 20} + config_validators = {'penalty': lambda x: x >= 0} + ''' + penalty: Number of penalty minutes each incorrect submission adds. Defaults to 20. + ''' + + @classmethod + def validate(cls, config): + if config is None: + return + + if not isinstance(config, dict): + raise ValidationError('ICPC-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 + last = 0 + penalty = 0 + score = 0 + format_data = {} + + with connection.cursor() as cursor: + cursor.execute(''' + SELECT MAX(cs.points) as `points`, ( + 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 points, 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 points: + 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 points: + cumtime += dt + last = max(last, dt) + + format_data[str(prob)] = {'time': dt, 'points': points, 'penalty': prev} + score += points + + participation.cumtime = max(0, cumtime + penalty) + participation.score = score + participation.tiebreaker = last # field is sorted from least to greatest + 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('') + + def get_contest_problem_label_script(self): + return ''' + function(n) + n = n + 1 + ret = "" + while n > 0 do + ret = string.char((n - 1) % 26 + 65) .. ret + n = math.floor((n - 1) / 26) + end + return ret + end + ''' \ No newline at end of file diff --git a/judge/contest_format/ioi.py b/judge/contest_format/ioi.py index c75d707..dba337c 100644 --- a/judge/contest_format/ioi.py +++ b/judge/contest_format/ioi.py @@ -73,6 +73,7 @@ class IOIContestFormat(DefaultContestFormat): participation.cumtime = max(cumtime, 0) participation.score = points + participation.tiebreaker = 0 participation.format_data = format_data participation.save() diff --git a/judge/highlight_code.py b/judge/highlight_code.py index ff330f7..308a58e 100644 --- a/judge/highlight_code.py +++ b/judge/highlight_code.py @@ -27,11 +27,12 @@ else: def wrap(self, source, outfile): return self._wrap_div(self._wrap_pre(_wrap_code(source))) - def highlight_code(code, language, cssclass='codehilite'): + def highlight_code(code, language, cssclass='codehilite', linenos=True): 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'))) + if linenos: + 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 index f316397..61ec4fd 100644 --- a/judge/jinja2/__init__.py +++ b/judge/jinja2/__init__.py @@ -8,7 +8,7 @@ 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, +from . import (camo, chat, datetime, filesize, gravatar, language, markdown, rating, reference, render, social, spaceless, submission, timedelta) from . import registry diff --git a/judge/jinja2/camo.py b/judge/jinja2/camo.py index 1baeeb2..a60da79 100644 --- a/judge/jinja2/camo.py +++ b/judge/jinja2/camo.py @@ -1,9 +1,8 @@ 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) + return camo_client.rewrite_url(url) \ No newline at end of file diff --git a/judge/jinja2/chat.py b/judge/jinja2/chat.py new file mode 100644 index 0000000..07fec5b --- /dev/null +++ b/judge/jinja2/chat.py @@ -0,0 +1,6 @@ +from . import registry +from chat_box.utils import encrypt_url + +@registry.function +def chat_param(request_profile, profile): + return encrypt_url(request_profile.id, profile.id) \ No newline at end of file diff --git a/judge/jinja2/markdown/__init__.py b/judge/jinja2/markdown/__init__.py index 4ca07bb..3cc5940 100644 --- a/judge/jinja2/markdown/__init__.py +++ b/judge/jinja2/markdown/__init__.py @@ -12,6 +12,7 @@ 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.jinja2.markdown.spoiler import SpoilerInlineGrammar, SpoilerInlineLexer, SpoilerRenderer from judge.utils.camo import client as camo_client from judge.utils.texoid import TEXOID_ENABLED, TexoidRenderer from .. import registry @@ -26,15 +27,15 @@ class CodeSafeInlineGrammar(mistune.InlineGrammar): emphasis = re.compile(r'^\*((?:\*\*|[^\*])+?)()\*(?!\*)') # *word* -class AwesomeInlineGrammar(MathInlineGrammar, CodeSafeInlineGrammar): +class AwesomeInlineGrammar(MathInlineGrammar, SpoilerInlineGrammar, CodeSafeInlineGrammar): pass -class AwesomeInlineLexer(MathInlineLexer, mistune.InlineLexer): +class AwesomeInlineLexer(MathInlineLexer, SpoilerInlineLexer, mistune.InlineLexer): grammar_class = AwesomeInlineGrammar -class AwesomeRenderer(MathRenderer, mistune.Renderer): +class AwesomeRenderer(MathRenderer, SpoilerRenderer, mistune.Renderer): def __init__(self, *args, **kwargs): self.nofollow = kwargs.pop('nofollow', True) self.texoid = TexoidRenderer() if kwargs.pop('texoid', False) else None @@ -128,7 +129,6 @@ def markdown(value, style, math_engine=None, lazy_load=False): 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)) diff --git a/judge/jinja2/markdown/math.py b/judge/jinja2/markdown/math.py index 6abced9..08883c5 100644 --- a/judge/jinja2/markdown/math.py +++ b/judge/jinja2/markdown/math.py @@ -64,4 +64,4 @@ class MathRenderer(mistune.Renderer): 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) + return self.mathoid.inline_math(math) \ No newline at end of file diff --git a/judge/jinja2/markdown/spoiler.py b/judge/jinja2/markdown/spoiler.py new file mode 100644 index 0000000..5df7950 --- /dev/null +++ b/judge/jinja2/markdown/spoiler.py @@ -0,0 +1,27 @@ +import re +import mistune + + +class SpoilerInlineGrammar(mistune.InlineGrammar): + spoiler = re.compile(r'^\|\|(.+?)\s+([\s\S]+?)\s*\|\|') + + +class SpoilerInlineLexer(mistune.InlineLexer): + grammar_class = SpoilerInlineGrammar + + def __init__(self, *args, **kwargs): + self.default_rules.insert(0, 'spoiler') + super(SpoilerInlineLexer, self).__init__(*args, **kwargs) + + def output_spoiler(self, m): + return self.renderer.spoiler(m.group(1), m.group(2)) + + +class SpoilerRenderer(mistune.Renderer): + def spoiler(self, summary, text): + return '''
+ + %s + +
%s
+
''' % (summary, text) \ No newline at end of file diff --git a/judge/jinja2/timedelta.py b/judge/jinja2/timedelta.py index 03fd9db..2069610 100644 --- a/judge/jinja2/timedelta.py +++ b/judge/jinja2/timedelta.py @@ -24,5 +24,7 @@ def seconds(timedelta): @registry.filter @registry.render_with('time-remaining-fragment.html') -def as_countdown(timedelta): - return {'countdown': timedelta} +def as_countdown(time): + time_now = datetime.datetime.now(datetime.timezone.utc) + initial = abs(time - time_now) + return {'countdown': time, 'initial': initial} diff --git a/judge/management/commands/render_pdf.py b/judge/management/commands/render_pdf.py index cc45421..258081d 100644 --- a/judge/management/commands/render_pdf.py +++ b/judge/management/commands/render_pdf.py @@ -8,8 +8,8 @@ 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 - +from judge.pdf_problems import DefaultPdfMaker, PhantomJSPdfMaker, PuppeteerPDFRender, SeleniumPDFRender, \ + SlimerJSPdfMaker class Command(BaseCommand): help = 'renders a PDF file of a problem' @@ -24,6 +24,7 @@ class Command(BaseCommand): 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') + parser.add_argument('-S', '--selenium', action='store_const', const=SeleniumPDFRender, dest='engine') def handle(self, *args, **options): try: diff --git a/judge/migrations/0096_profile_language_set_default.py b/judge/migrations/0096_profile_language_set_default.py index 536b7fd..a0a9453 100644 --- a/judge/migrations/0096_profile_language_set_default.py +++ b/judge/migrations/0096_profile_language_set_default.py @@ -6,6 +6,11 @@ from django.db import migrations, models import judge.models.runtime +def create_python3(apps, schema_editor): + Language = apps.get_model('judge', 'Language') + Language.objects.get_or_create(key='PY3', defaults={'name': 'Python 3'})[0] + + class Migration(migrations.Migration): dependencies = [ @@ -13,6 +18,7 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RunPython(create_python3, reverse_code=migrations.RunPython.noop), migrations.AlterField( model_name='profile', name='language', diff --git a/judge/migrations/0115_auto_20210525_0222.py b/judge/migrations/0115_auto_20210525_0222.py new file mode 100644 index 0000000..91312de --- /dev/null +++ b/judge/migrations/0115_auto_20210525_0222.py @@ -0,0 +1,63 @@ +# Generated by Django 2.2.17 on 2021-05-24 19:22 + +from django.db import migrations, models + +def hide_scoreboard_eq_true(apps, schema_editor): + Contest = apps.get_model('judge', 'Contest') + Contest.objects.filter(hide_scoreboard=True).update(scoreboard_visibility='C') + + +def scoreboard_visibility_eq_contest(apps, schema_editor): + Contest = apps.get_model('judge', 'Contest') + Contest.objects.filter(scoreboard_visibility__in=('C', 'P')).update(hide_scoreboard=True) + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0114_auto_20201228_1041'), + ] + + 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'), ('moss_contest', 'MOSS contest'), ('contest_rating', 'Rate contests'), ('contest_access_code', 'Contest access codes'), ('create_private_contest', 'Create private contests'), ('change_contest_visibility', 'Change contest visibility'), ('contest_problem_label', 'Edit contest problem label script')), 'verbose_name': 'contest', 'verbose_name_plural': 'contests'}, + ), + migrations.RemoveField( + model_name='contest', + name='hide_scoreboard', + ), + migrations.RemoveField( + model_name='contest', + name='organizers', + ), + migrations.AddField( + model_name='contest', + name='authors', + field=models.ManyToManyField(help_text='These users will be able to edit the contest.', related_name='_contest_authors_+', to='judge.Profile'), + ), + migrations.AddField( + model_name='contest', + name='curators', + field=models.ManyToManyField(blank=True, help_text='These users will be able to edit the contest, but will not be listed as authors.', related_name='_contest_curators_+', to='judge.Profile'), + ), + migrations.AddField( + model_name='contest', + name='problem_label_script', + field=models.TextField(blank=True, help_text='A custom Lua function to generate problem labels. Requires a single function with an integer parameter, the zero-indexed contest problem index, and returns a string, the label.', verbose_name='contest problem label script'), + ), + migrations.AddField( + model_name='contest', + name='scoreboard_visibility', + field=models.CharField(choices=[('V', 'Visible'), ('C', 'Hidden for duration of contest'), ('P', 'Hidden for duration of participation')], default='V', help_text='Scoreboard visibility through the duration of the contest', max_length=1, verbose_name='scoreboard visibility'), + ), + migrations.AddField( + model_name='contest', + name='testers', + field=models.ManyToManyField(blank=True, help_text='These users will be able to view the contest, but not edit it.', related_name='_contest_testers_+', to='judge.Profile'), + ), + migrations.AddField( + model_name='contestparticipation', + name='tiebreaker', + field=models.FloatField(default=0.0, verbose_name='tie-breaking field'), + ), + ] diff --git a/judge/migrations/0116_auto_20211011_0645.py b/judge/migrations/0116_auto_20211011_0645.py new file mode 100644 index 0000000..c067a59 --- /dev/null +++ b/judge/migrations/0116_auto_20211011_0645.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.17 on 2021-10-10 23:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0115_auto_20210525_0222'), + ] + + operations = [ + migrations.AlterField( + model_name='contest', + name='format_name', + field=models.CharField(choices=[('atcoder', 'AtCoder'), ('default', 'Default'), ('ecoo', 'ECOO'), ('icpc', 'ICPC'), ('ioi', 'IOI')], default='default', help_text='The contest format module to use.', max_length=32, verbose_name='contest format'), + ), + ] diff --git a/judge/migrations/0117_auto_20211209_0612.py b/judge/migrations/0117_auto_20211209_0612.py new file mode 100644 index 0000000..dd3879a --- /dev/null +++ b/judge/migrations/0117_auto_20211209_0612.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.25 on 2021-12-08 23:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0116_auto_20211011_0645'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='timezone', + field=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/Nuuk', 'Nuuk'), ('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/Kanton', 'Kanton'), ('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='Asia/Ho_Chi_Minh', max_length=50, verbose_name='location'), + ), + ] diff --git a/judge/migrations/0118_rating.py b/judge/migrations/0118_rating.py new file mode 100644 index 0000000..8ad6ad2 --- /dev/null +++ b/judge/migrations/0118_rating.py @@ -0,0 +1,208 @@ +import math +from operator import attrgetter, itemgetter + +from django.db import migrations, models +from django.db.models import Count, OuterRef, Subquery +from django.db.models.functions import Coalesce +from django.utils import timezone + + +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 _ in buf: + yield rank + (delta - 1) / 2.0 + rank += delta + delta = 0 + buf = [] + delta += 1 + buf.append(item) + last = key(item) + for _ in buf: + yield rank + (delta - 1) / 2.0 + + +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, is_disqualified): + # 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 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 + + 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 is_disqualified[i]: + # DQed users can manipulate TopCoder ratings to get higher volatility in order to increase their rating + # later on, prohibit this by ensuring their volatility never increases in this situation + new_volatility[i] = min(new_volatility[i], old_volatility[i]) + + # 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 tc_rate_contest(contest, Rating, Profile): + rating_subquery = Rating.objects.filter(user=OuterRef('user')) + rating_sorted = rating_subquery.order_by('-contest__end_time') + users = contest.users.order_by('is_disqualified', '-score', 'cumtime', 'tiebreaker') \ + .annotate(submissions=Count('submission'), + last_rating=Coalesce(Subquery(rating_sorted.values('rating')[:1]), 1200), + volatility=Coalesce(Subquery(rating_sorted.values('volatility')[:1]), 535), + times=Coalesce(Subquery(rating_subquery.order_by().values('user_id') + .annotate(count=Count('id')).values('count')), 0)) \ + .exclude(user_id__in=contest.rate_exclude.all()) \ + .filter(virtual=0).values('id', 'user_id', 'score', 'cumtime', 'tiebreaker', 'is_disqualified', + 'last_rating', 'volatility', 'times') + if not contest.rate_all: + users = users.filter(submissions__gt=0) + if contest.rating_floor is not None: + users = users.exclude(last_rating__lt=contest.rating_floor) + if contest.rating_ceiling is not None: + users = users.exclude(last_rating__gt=contest.rating_ceiling) + + users = list(users) + participation_ids = list(map(itemgetter('id'), users)) + user_ids = list(map(itemgetter('user_id'), users)) + is_disqualified = list(map(itemgetter('is_disqualified'), users)) + ranking = list(tie_ranker(users, key=itemgetter('score', 'cumtime', 'tiebreaker'))) + old_rating = list(map(itemgetter('last_rating'), users)) + old_volatility = list(map(itemgetter('volatility'), users)) + times_ranked = list(map(itemgetter('times'), users)) + rating, volatility = recalculate_ratings(old_rating, old_volatility, ranking, times_ranked, is_disqualified) + + now = timezone.now() + ratings = [Rating(user_id=i, contest=contest, rating=r, volatility=v, last_rated=now, participation_id=p, rank=z) + for i, p, r, v, z in zip(user_ids, participation_ids, rating, volatility, ranking)] + + Rating.objects.bulk_create(ratings) + + Profile.objects.filter(contest_history__contest=contest, contest_history__virtual=0).update( + rating=Subquery(Rating.objects.filter(user=OuterRef('id')) + .order_by('-contest__end_time').values('rating')[:1])) + + +# inspired by rate_all_view +def rate_tc(apps, schema_editor): + Contest = apps.get_model('judge', 'Contest') + Rating = apps.get_model('judge', 'Rating') + Profile = apps.get_model('judge', 'Profile') + + with schema_editor.connection.cursor() as cursor: + cursor.execute('TRUNCATE TABLE `%s`' % Rating._meta.db_table) + Profile.objects.update(rating=None) + for contest in Contest.objects.filter(is_rated=True, end_time__lte=timezone.now()).order_by('end_time'): + tc_rate_contest(contest, Rating, Profile) + + +# inspired by rate_all_view +def rate_elo_mmr(apps, schema_editor): + Rating = apps.get_model('judge', 'Rating') + Profile = apps.get_model('judge', 'Profile') + + with schema_editor.connection.cursor() as cursor: + cursor.execute('TRUNCATE TABLE `%s`' % Rating._meta.db_table) + Profile.objects.update(rating=None) + # Don't populate Rating + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0117_auto_20211209_0612'), + ] + + operations = [ + migrations.RunPython(migrations.RunPython.noop, rate_tc, atomic=True), + migrations.AddField( + model_name='rating', + name='mean', + field=models.FloatField(verbose_name='raw rating'), + ), + migrations.AddField( + model_name='rating', + name='performance', + field=models.FloatField(verbose_name='contest performance'), + ), + migrations.RemoveField( + model_name='rating', + name='volatility', + field=models.IntegerField(verbose_name='volatility'), + ), + migrations.RunPython(rate_elo_mmr, migrations.RunPython.noop, atomic=True), + ] \ No newline at end of file diff --git a/judge/models/comment.py b/judge/models/comment.py index d2d9688..a58ab1d 100644 --- a/judge/models/comment.py +++ b/judge/models/comment.py @@ -105,7 +105,7 @@ class Comment(MPTTModel): try: link = None if self.page.startswith('p:'): - link = reverse('problem_detail', args=(self.page[2:],)) + link = reverse('problem_comments', args=(self.page[2:],)) elif self.page.startswith('c:'): link = reverse('contest_view', args=(self.page[2:],)) elif self.page.startswith('b:'): diff --git a/judge/models/contest.py b/judge/models/contest.py index 939e06d..8d75ee3 100644 --- a/judge/models/contest.py +++ b/judge/models/contest.py @@ -1,12 +1,13 @@ from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator from django.db import models, transaction -from django.db.models import CASCADE +from django.db.models import CASCADE, Q 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 lupa import LuaRuntime from moss import MOSS_LANG_C, MOSS_LANG_CC, MOSS_LANG_JAVA, MOSS_LANG_PYTHON, MOSS_LANG_PASCAL from judge import contest_format @@ -48,11 +49,25 @@ class ContestTag(models.Model): class Contest(models.Model): + SCOREBOARD_VISIBLE = 'V' + SCOREBOARD_AFTER_CONTEST = 'C' + SCOREBOARD_AFTER_PARTICIPATION = 'P' + SCOREBOARD_VISIBILITY = ( + (SCOREBOARD_VISIBLE, _('Visible')), + (SCOREBOARD_AFTER_CONTEST, _('Hidden for duration of contest')), + (SCOREBOARD_AFTER_PARTICIPATION, _('Hidden for duration of participation')), + ) 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+') + authors = models.ManyToManyField(Profile, help_text=_('These users will be able to edit the contest.'), + related_name='authors+') + curators = models.ManyToManyField(Profile, help_text=_('These users will be able to edit the contest, ' + 'but will not be listed as authors.'), + related_name='curators+', blank=True) + testers = models.ManyToManyField(Profile, help_text=_('These users will be able to view the contest, ' + 'but not edit it.'), + blank=True, related_name='testers+') 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) @@ -64,10 +79,9 @@ class Contest(models.Model): '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) + scoreboard_visibility = models.CharField(verbose_name=_('scoreboard visibility'), default=SCOREBOARD_VISIBLE, + max_length=1, help_text=_('Scoreboard visibility through the duration ' + 'of the contest'), choices=SCOREBOARD_VISIBILITY) view_contest_scoreboard = models.ManyToManyField(Profile, verbose_name=_('view contest scoreboard'), blank=True, related_name='view_contest_scoreboard', help_text=_('These users will be able to view the scoreboard.')) @@ -116,6 +130,10 @@ class Contest(models.Model): 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.')) + problem_label_script = models.TextField(verbose_name='contest problem label script', blank=True, + help_text='A custom Lua function to generate problem labels. Requires a ' + 'single function with an integer parameter, the zero-indexed ' + 'contest problem index, and returns a string, the label.') points_precision = models.IntegerField(verbose_name=_('precision points'), default=2, validators=[MinValueValidator(0), MaxValueValidator(10)], help_text=_('Number of digits to round points to.')) @@ -128,30 +146,72 @@ class Contest(models.Model): def format(self): return self.format_class(self, self.format_config) + @cached_property + def get_label_for_problem(self): + def DENY_ALL(obj, attr_name, is_setting): + raise AttributeError() + lua = LuaRuntime(attribute_filter=DENY_ALL, register_eval=False, register_builtins=False) + return lua.eval(self.problem_label_script or self.format.get_contest_problem_label_script()) + 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) + try: + # a contest should have at least one problem, with contest problem index 0 + # so test it to see if the script returns a valid label. + label = self.get_label_for_problem(0) + except Exception as e: + raise ValidationError('Contest problem label script: %s' % e) + else: + if not isinstance(label, str): + raise ValidationError('Contest problem label script: script should return a string.') + 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'): + def can_see_own_scoreboard(self, user): + if self.can_see_full_scoreboard(user): return True - if user.is_authenticated and self.organizers.filter(id=user.profile.id).exists(): - return True - if user.is_authenticated and self.view_contest_scoreboard.filter(id=user.profile.id).exists(): - return True - if not self.is_visible: + if not self.can_join: return False - if self.start_time is not None and self.start_time > timezone.now(): + if not self.show_scoreboard and not self.is_in_contest(user): return False - if self.hide_scoreboard and not self.is_in_contest(user) and self.end_time > timezone.now(): + return True + + def can_see_full_scoreboard(self, user): + if self.show_scoreboard: + return True + if not user.is_authenticated: + return False + if user.has_perm('judge.see_private_contest') or user.has_perm('judge.edit_all_contest'): + return True + if user.profile.id in self.editor_ids: + return True + if self.view_contest_scoreboard.filter(id=user.profile.id).exists(): + return True + if self.scoreboard_visibility == self.SCOREBOARD_AFTER_PARTICIPATION and self.has_completed_contest(user): + return True + return False + + def has_completed_contest(self, user): + if user.is_authenticated: + participation = self.users.filter(virtual=ContestParticipation.LIVE, user=user.profile).first() + if participation and participation.ended: + return True + return False + + @cached_property + def show_scoreboard(self): + if not self.can_join: + return False + if (self.scoreboard_visibility in (self.SCOREBOARD_AFTER_CONTEST, self.SCOREBOARD_AFTER_PARTICIPATION) and + not self.ended): return False return True @@ -186,6 +246,19 @@ class Contest(models.Model): def ended(self): return self.end_time < self._now + @cached_property + def author_ids(self): + return Contest.authors.through.objects.filter(contest=self).values_list('profile_id', flat=True) + + @cached_property + def editor_ids(self): + return self.author_ids.union( + Contest.curators.through.objects.filter(contest=self).values_list('profile_id', flat=True)) + + @cached_property + def tester_ids(self): + return Contest.testers.through.objects.filter(contest=self).values_list('profile_id', flat=True) + def __str__(self): return self.name @@ -198,50 +271,111 @@ class Contest(models.Model): update_user_count.alters_data = True - @cached_property - def show_scoreboard(self): - if self.hide_scoreboard and not self.ended: - return False - return True + class Inaccessible(Exception): + pass + + class PrivateContest(Exception): + pass + + def access_check(self, user): + # Do unauthenticated check here so we can skip authentication checks later on. + if not user.is_authenticated: + # Unauthenticated users can only see visible, non-private contests + if not self.is_visible: + raise self.Inaccessible() + if self.is_private or self.is_organization_private: + raise self.PrivateContest() + return + + # If the user can view or edit all contests + if user.has_perm('judge.see_private_contest') or user.has_perm('judge.edit_all_contest'): + return + + # User is organizer or curator for contest + if user.profile.id in self.editor_ids: + return + + # User is tester for contest + if user.profile.id in self.tester_ids: + return + + # Contest is not publicly visible + if not self.is_visible: + raise self.Inaccessible() + + # Contest is not private + if not self.is_private and not self.is_organization_private: + return + + if self.view_contest_scoreboard.filter(id=user.profile.id).exists(): + return + + in_org = self.organizations.filter(id__in=user.profile.organizations.all()).exists() + in_users = self.private_contestants.filter(id=user.profile.id).exists() + + if not self.is_private and self.is_organization_private: + if in_org: + return + raise self.PrivateContest() + + if self.is_private and not self.is_organization_private: + if in_users: + return + raise self.PrivateContest() + + if self.is_private and self.is_organization_private: + if in_org and in_users: + return + raise self.PrivateContest() 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 self.view_contest_scoreboard.filter(id=user.profile.id).exists(): - return True - - # If the user can view all contests - if user.has_perm('judge.see_private_contest'): + try: + self.access_check(user) + except (self.Inaccessible, self.PrivateContest): + return False + else: 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(): + # If the user is a contest organizer or curator + if user.has_perm('judge.edit_own_contest') and user.profile.id in self.editor_ids: return True return False + @classmethod + def get_visible_contests(cls, user): + if not user.is_authenticated: + return cls.objects.filter(is_visible=True, is_organization_private=False, is_private=False) \ + .defer('description').distinct() + + queryset = cls.objects.defer('description') + if not (user.has_perm('judge.see_private_contest') or user.has_perm('judge.edit_all_contest')): + q = Q(is_visible=True) + q &= ( + Q(view_contest_scoreboard=user.profile) | + Q(is_organization_private=False, is_private=False) | + Q(is_organization_private=False, is_private=True, private_contestants=user.profile) | + Q(is_organization_private=True, is_private=False, organizations__in=user.profile.organizations.all()) | + Q(is_organization_private=True, is_private=True, organizations__in=user.profile.organizations.all(), + private_contestants=user.profile) + ) + + q |= Q(authors=user.profile) + q |= Q(curators=user.profile) + q |= Q(testers=user.profile) + queryset = queryset.filter(q) + return queryset.distinct() + 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'): + Rating.objects.filter(contest__end_time__range=(self.end_time, self._now)).delete() + for contest in Contest.objects.filter( + is_rated=True, end_time__range=(self.end_time, self._now), + ).order_by('end_time'): rate_contest(contest) class Meta: @@ -255,6 +389,7 @@ class Contest(models.Model): ('contest_access_code', _('Contest access codes')), ('create_private_contest', _('Create private contests')), ('change_contest_visibility', _('Change contest visibility')), + ('contest_problem_label', _('Edit contest problem label script')), ) verbose_name = _('contest') verbose_name_plural = _('contests') @@ -271,6 +406,7 @@ class ContestParticipation(models.Model): 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.')) + tiebreaker = models.FloatField(verbose_name=_('tie-breaking field'), default=0.0) 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) @@ -395,7 +531,8 @@ class Rating(models.Model): related_name='rating', on_delete=CASCADE) rank = models.IntegerField(verbose_name=_('rank')) rating = models.IntegerField(verbose_name=_('rating')) - volatility = models.IntegerField(verbose_name=_('volatility')) + mean = models.FloatField(verbose_name=_('raw rating')) + performance = models.FloatField(verbose_name=_('contest performance')) last_rated = models.DateTimeField(db_index=True, verbose_name=_('last rated')) class Meta: diff --git a/judge/models/problem.py b/judge/models/problem.py index a469ef6..4f7e545 100644 --- a/judge/models/problem.py +++ b/judge/models/problem.py @@ -5,7 +5,7 @@ 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 import CASCADE, F, Q, QuerySet, SET_NULL from django.db.models.expressions import RawSQL from django.db.models.functions import Coalesce from django.urls import reverse @@ -219,6 +219,43 @@ class Problem(models.Model): def is_subs_manageable_by(self, user): return user.is_staff and user.has_perm('judge.rejudge_submission') and self.is_editable_by(user) + + @classmethod + def get_visible_problems(cls, user): + # Do unauthenticated check here so we can skip authentication checks later on. + if not user.is_authenticated: + return cls.get_public_problems() + + # Conditions for visible problem: + # - `judge.edit_all_problem` or `judge.see_private_problem` + # - otherwise + # - not is_public problems + # - author or curator or tester + # - is_public problems + # - not is_organization_private or in organization or `judge.see_organization_problem` + # - author or curator or tester + queryset = cls.objects.defer('description') + + if not (user.has_perm('judge.see_private_problem') or user.has_perm('judge.edit_all_problem')): + q = Q(is_public=True) + if not user.has_perm('judge.see_organization_problem'): + # Either not organization private or in the organization. + q &= ( + Q(is_organization_private=False) | + Q(is_organization_private=True, organizations__in=user.profile.organizations.all()) + ) + + # Authors, curators, and testers should always have access, so OR at the very end. + q |= Q(authors=user.profile) + q |= Q(curators=user.profile) + q |= Q(testers=user.profile) + queryset = queryset.filter(q) + + return queryset + + @classmethod + def get_public_problems(cls): + return cls.objects.filter(is_public=True, is_organization_private=False).defer('description') def __str__(self): return self.name diff --git a/judge/models/problem_data.py b/judge/models/problem_data.py index da443e5..fe79c49 100644 --- a/judge/models/problem_data.py +++ b/judge/models/problem_data.py @@ -1,11 +1,13 @@ import errno import os +from zipfile import BadZipFile, ZipFile from django.core.validators import FileExtensionValidator +from django.core.cache import cache from django.db import models from django.utils.translation import gettext_lazy as _ -from judge.utils.problem_data import ProblemDataStorage +from judge.utils.problem_data import ProblemDataStorage, get_file_cachekey __all__ = ['problem_data_storage', 'problem_directory_file', 'ProblemData', 'ProblemTestCase', 'CHECKERS'] @@ -66,7 +68,16 @@ class ProblemData(models.Model): self.__original_zipfile = self.zipfile def save(self, *args, **kwargs): - if self.zipfile != self.__original_zipfile: + if self.zipfile != self.__original_zipfile and self.__original_zipfile: + # Delete caches + try: + files = ZipFile(self.__original_zipfile.path).namelist() + for file in files: + cache_key = 'problem_archive:%s:%s' % (self.problem.code, get_file_cachekey(file)) + cache.delete(cache_key) + except BadZipFile: + pass + self.__original_zipfile.delete(save=False) return super(ProblemData, self).save(*args, **kwargs) diff --git a/judge/models/profile.py b/judge/models/profile.py index 2fb51a3..7e2dc7f 100644 --- a/judge/models/profile.py +++ b/judge/models/profile.py @@ -136,12 +136,15 @@ class Profile(models.Model): 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() + public_problems = Problem.get_public_problems() + data = ( + public_problems.filter(submission__user=self, submission__points__isnull=False) + .annotate(max_points=Max('submission__points')).order_by('-max_points') + .values_list('max_points', flat=True).filter(max_points__gt=0) + ) + extradata = ( + public_problems.filter(submission__user=self, submission__result='AC').values('id').distinct().count() + ) bonus_function = settings.DMOJ_PP_BONUS_FUNCTION points = sum(data) problems = len(data) @@ -163,8 +166,12 @@ class Profile(models.Model): 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)): + from judge.models import ContestParticipation + try: + contest = self.current_contest + if contest is not None and (contest.ended or not contest.contest.is_accessible_by(self.user)): + self.remove_contest() + except ContestParticipation.DoesNotExist: self.remove_contest() update_contest.alters_data = True @@ -254,5 +261,13 @@ class Friend(models.Model): else: self.make_friend(current_user, new_friend) + @classmethod + def get_friend_profiles(self, current_user): + try: + ret = self.objects.get(current_user=current_user).users.all() + except Friend.DoesNotExist: + ret = Profile.objects.none() + return ret + def __str__(self): return str(self.current_user) diff --git a/judge/models/runtime.py b/judge/models/runtime.py index d28be9c..16cdd66 100644 --- a/judge/models/runtime.py +++ b/judge/models/runtime.py @@ -97,7 +97,10 @@ class Language(models.Model): @classmethod def get_default_language(cls): - return Language.objects.get(key=settings.DEFAULT_USER_LANGUAGE) + try: + return Language.objects.get(key=settings.DEFAULT_USER_LANGUAGE) + except Language.DoesNotExist: + return cls.get_python3() @classmethod def get_default_language_pk(cls): diff --git a/judge/pdf_problems.py b/judge/pdf_problems.py index 0e9835e..a5b318f 100644 --- a/judge/pdf_problems.py +++ b/judge/pdf_problems.py @@ -1,3 +1,4 @@ +import base64 import errno import io import json @@ -10,6 +11,20 @@ import uuid from django.conf import settings from django.utils.translation import gettext +logger = logging.getLogger('judge.problem.pdf') + +HAS_SELENIUM = False +if settings.USE_SELENIUM: + try: + from selenium import webdriver + from selenium.common.exceptions import TimeoutException + from selenium.webdriver.common.by import By + from selenium.webdriver.support import expected_conditions as EC + from selenium.webdriver.support.ui import WebDriverWait + HAS_SELENIUM = True + except ImportError: + logger.warning('Failed to import Selenium', exc_info=True) + HAS_PHANTOMJS = os.access(settings.PHANTOMJS, os.X_OK) HAS_SLIMERJS = os.access(settings.SLIMERJS, os.X_OK) @@ -18,13 +33,11 @@ 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)) + (HAS_PHANTOMJS or HAS_SLIMERJS or HAS_PUPPETEER or HAS_SELENIUM)) EXIFTOOL = settings.EXIFTOOL HAS_EXIFTOOL = os.access(EXIFTOOL, os.X_OK) -logger = logging.getLogger('judge.problem.pdf') - class BasePdfMaker(object): math_engine = 'jax' @@ -240,8 +253,8 @@ puppeteer.launch().then(browser => Promise.resolve() 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')), + 'input': 'file://%s' % self.htmlfile, + 'output': self.pdffile, 'paper': settings.PUPPETEER_PAPER_SIZE, 'footer': gettext('Page [page] of [topage]'), })) @@ -257,9 +270,55 @@ puppeteer.launch().then(browser => Promise.resolve() self.proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.dir, env=env) self.log = self.proc.communicate()[0] +class SeleniumPDFRender(BasePdfMaker): + success = False + template = { + 'printBackground': True, + 'displayHeaderFooter': True, + 'headerTemplate': '
', + 'footerTemplate': '
' + + gettext('Page %s of %s') % + ('', '') + + '
', + } + + def get_log(self, driver): + return '\n'.join(map(str, driver.get_log('driver') + driver.get_log('browser'))) + + def _make(self, debug): + options = webdriver.ChromeOptions() + options.add_argument("--headless") + options.add_argument("--no-sandbox") # for root + options.binary_location = settings.SELENIUM_CUSTOM_CHROME_PATH + + browser = webdriver.Chrome(settings.SELENIUM_CHROMEDRIVER_PATH, options=options) + browser.get('file://%s' % self.htmlfile) + self.log = self.get_log(browser) + + try: + WebDriverWait(browser, 15).until(EC.presence_of_element_located((By.CLASS_NAME, 'math-loaded'))) + except TimeoutException: + logger.error('PDF math rendering timed out') + self.log = self.get_log(browser) + '\nPDF math rendering timed out' + browser.quit() + return + response = browser.execute_cdp_cmd('Page.printToPDF', self.template) + self.log = self.get_log(browser) + if not response: + browser.quit() + return + + with open(self.pdffile, 'wb') as f: + f.write(base64.b64decode(response['data'])) + + self.success = True + browser.quit() + if HAS_PUPPETEER: DefaultPdfMaker = PuppeteerPDFRender +elif HAS_SELENIUM: + DefaultPdfMaker = SeleniumPDFRender elif HAS_SLIMERJS: DefaultPdfMaker = SlimerJSPdfMaker elif HAS_PHANTOMJS: diff --git a/judge/ratings.py b/judge/ratings.py index 8fb5ff8..9d0f36d 100644 --- a/judge/ratings.py +++ b/judge/ratings.py @@ -1,162 +1,197 @@ -import math from bisect import bisect -from operator import itemgetter +from math import pi, sqrt, tanh +from operator import attrgetter, itemgetter -from django.db import connection, transaction -from django.db.models import Count +from django.db import transaction +from django.db.models import Count, OuterRef, Subquery +from django.db.models.functions import Coalesce from django.utils import timezone -from judge.utils.ranker import tie_ranker + +BETA2 = 328.33 ** 2 +RATING_INIT = 1200 # Newcomer's rating when applying the rating floor/ceiling +MEAN_INIT = 1400. +VAR_INIT = 250**2 * (BETA2 / 212**2) +SD_INIT = sqrt(VAR_INIT) +VALID_RANGE = MEAN_INIT - 20 * SD_INIT, MEAN_INIT + 20 * SD_INIT +VAR_PER_CONTEST = 1219.047619 * (BETA2 / 212**2) +VAR_LIM = (sqrt(VAR_PER_CONTEST**2 + 4 * BETA2 * VAR_PER_CONTEST) - VAR_PER_CONTEST) / 2 +SD_LIM = sqrt(VAR_LIM) +TANH_C = sqrt(3) / pi -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 tie_ranker(iterable, key=attrgetter('points')): + rank = 0 + delta = 1 + last = None + buf = [] + for item in iterable: + new = key(item) + if new != last: + for _ in buf: + yield rank + (delta - 1) / 2.0 + rank += delta + delta = 0 + buf = [] + delta += 1 + buf.append(item) + last = key(item) + for _ in buf: + yield rank + (delta - 1) / 2.0 -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 eval_tanhs(tanh_terms, x): + return sum((wt / sd) * tanh((x - mu) / (2 * sd)) for mu, sd, wt in tanh_terms) -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 +def solve(tanh_terms, y_tg, lin_factor=0, bounds=VALID_RANGE): + L, R = bounds + Ly, Ry = None, None + while R - L > 2: + x = (L + R) / 2 + y = lin_factor * x + eval_tanhs(tanh_terms, x) + if y > y_tg: + R, Ry = x, y + elif y < y_tg: + L, Ly = x, y 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 + return x + # Use linear interpolation to be slightly more accurate. + if Ly is None: + Ly = lin_factor * L + eval_tanhs(tanh_terms, L) + if y_tg <= Ly: + return L + if Ry is None: + Ry = lin_factor * R + eval_tanhs(tanh_terms, R) + if y_tg >= Ry: + return R + ratio = (y_tg - Ly) / (Ry - Ly) + return L * (1 - ratio) + R * ratio - # 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 get_var(times_ranked, cache=[VAR_INIT]): + while times_ranked >= len(cache): + next_var = 1. / (1. / (cache[-1] + VAR_PER_CONTEST) + 1. / BETA2) + cache.append(next_var) + return cache[times_ranked] + + +def recalculate_ratings(ranking, old_mean, times_ranked, historical_p): + n = len(ranking) + new_p = [0.] * n + new_mean = [0.] * n + + # Note: pre-multiply delta by TANH_C to improve efficiency. + delta = [TANH_C * sqrt(get_var(t) + VAR_PER_CONTEST + BETA2) for t in times_ranked] + p_tanh_terms = [(m, d, 1) for m, d in zip(old_mean, delta)] + + # Calculate performance at index i. + def solve_idx(i, bounds=VALID_RANGE): + r = ranking[i] + y_tg = 0 + for d, s in zip(delta, ranking): + if s > r: # s loses to r + y_tg += 1. / d + elif s < r: # s beats r + y_tg -= 1. / d + # Otherwise, this is a tie that counts as half a win, as per Elo-MMR. + new_p[i] = solve(p_tanh_terms, y_tg, bounds=bounds) + + # Fill all indices between i and j, inclusive. Use the fact that new_p is non-increasing. + def divconq(i, j): + if j - i > 1: + k = (i + j) // 2 + solve_idx(k, bounds=(new_p[j], new_p[i])) + divconq(i, k) + divconq(k, j) + + if n < 2: + new_p = list(old_mean) + new_mean = list(old_mean) + else: + # Calculate performance. + solve_idx(0) + solve_idx(n - 1) + divconq(0, n - 1) + + # Calculate mean. + for i, r in enumerate(ranking): + tanh_terms = [] + w_prev = 1. + w_sum = 0. + for j, h in enumerate([new_p[i]] + historical_p[i]): + gamma2 = (VAR_PER_CONTEST if j > 0 else 0) + h_var = get_var(times_ranked[i] + 1 - j) + k = h_var / (h_var + gamma2) + w = w_prev * k**2 + # Future optimization: If j is around 20, then w < 1e-3 and it is possible to break early. + tanh_terms.append((h, sqrt(BETA2) * TANH_C, w)) + w_prev = w + w_sum += w / BETA2 + w0 = 1. / get_var(times_ranked[i] + 1) - w_sum + p0 = eval_tanhs(tanh_terms[1:], old_mean[i]) / w0 + old_mean[i] + new_mean[i] = solve(tanh_terms, w0 * p0, lin_factor=w0) + + # Display a slightly lower rating to incentivize participation. + # As times_ranked increases, new_rating converges to new_mean. + new_rating = [max(1, round(m - (sqrt(get_var(t + 1)) - SD_LIM))) for m, t in zip(new_mean, times_ranked)] + + return new_rating, new_mean, new_p 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') + rating_subquery = Rating.objects.filter(user=OuterRef('user')) + rating_sorted = rating_subquery.order_by('-contest__end_time') + users = contest.users.order_by('is_disqualified', '-score', 'cumtime', 'tiebreaker') \ + .annotate(submissions=Count('submission'), + last_rating=Coalesce(Subquery(rating_sorted.values('rating')[:1]), RATING_INIT), + last_mean=Coalesce(Subquery(rating_sorted.values('mean')[:1]), MEAN_INIT), + times=Coalesce(Subquery(rating_subquery.order_by().values('user_id') + .annotate(count=Count('id')).values('count')), 0)) \ + .exclude(user_id__in=contest.rate_exclude.all()) \ + .filter(virtual=0).values('id', 'user_id', 'score', 'cumtime', 'tiebreaker', + 'last_rating', 'last_mean', 'times') 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) + users = users.exclude(last_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) + users = users.exclude(last_rating__gt=contest.rating_ceiling) + + users = list(users) + participation_ids = list(map(itemgetter('id'), users)) + user_ids = list(map(itemgetter('user_id'), users)) + ranking = list(tie_ranker(users, key=itemgetter('score', 'cumtime', 'tiebreaker'))) + old_mean = list(map(itemgetter('last_mean'), users)) + times_ranked = list(map(itemgetter('times'), users)) + historical_p = [[] for _ in users] + + user_id_to_idx = {uid: i for i, uid in enumerate(user_ids)} + for h in Rating.objects.filter(user_id__in=user_ids) \ + .order_by('-contest__end_time') \ + .values('user_id', 'performance'): + idx = user_id_to_idx[h['user_id']] + historical_p[idx].append(h['performance']) + + rating, mean, performance = recalculate_ratings(ranking, old_mean, times_ranked, historical_p) 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))) + ratings = [Rating(user_id=i, contest=contest, rating=r, mean=m, performance=perf, + last_rated=now, participation_id=pid, rank=z) + for i, pid, r, m, perf, z in zip(user_ids, participation_ids, rating, mean, performance, ranking)] 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 + + Profile.objects.filter(contest_history__contest=contest, contest_history__virtual=0).update( + rating=Subquery(Rating.objects.filter(user=OuterRef('id')) + .order_by('-contest__end_time').values('rating')[:1])) 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', +RATING_VALUES = [1000, 1400, 1700, 1900, 2100, 2400, 3000] +RATING_CLASS = ['rate-newbie', 'rate-amateur', 'rate-specialist', 'rate-expert', 'rate-candidate-master', 'rate-master', 'rate-grandmaster', 'rate-target'] @@ -178,4 +213,4 @@ def rating_progress(rating): return 1.0 prev = 0 if not level else RATING_VALUES[level - 1] next = RATING_VALUES[level] - return (rating - prev + 0.0) / (next - prev) + return (rating - prev + 0.0) / (next - prev) \ No newline at end of file diff --git a/judge/sitemap.py b/judge/sitemap.py index 6ae8657..2deea97 100644 --- a/judge/sitemap.py +++ b/judge/sitemap.py @@ -11,7 +11,7 @@ class ProblemSitemap(Sitemap): priority = 0.8 def items(self): - return Problem.objects.filter(is_public=True, is_organization_private=False).values_list('code') + return Problem.get_public_problems().values_list('code') def location(self, obj): return reverse('problem_detail', args=obj) diff --git a/judge/social_auth.py b/judge/social_auth.py index b6c5e10..7546010 100644 --- a/judge/social_auth.py +++ b/judge/social_auth.py @@ -83,7 +83,7 @@ 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() + profile.language = Language.get_default_language() logger.info('Info from %s: %s', backend.name, response) profile.save() form = ProfileForm(instance=profile, user=user) diff --git a/judge/tasks/__init__.py b/judge/tasks/__init__.py index 22c5253..90fd6d3 100644 --- a/judge/tasks/__init__.py +++ b/judge/tasks/__init__.py @@ -1,3 +1,4 @@ +from judge.tasks.contest import * from judge.tasks.demo import * from judge.tasks.contest import * from judge.tasks.submission import * diff --git a/judge/tasks/experiment.py b/judge/tasks/experiment.py index f2e4b2f..0e991c4 100644 --- a/judge/tasks/experiment.py +++ b/judge/tasks/experiment.py @@ -1,10 +1,6 @@ -from django.contrib.auth.models import User -from django.conf import settings - -from judge.models import SubmissionTestCase, Problem, Profile, Language, Organization +from judge.models import SubmissionTestCase, Problem from collections import defaultdict -import csv def generate_report(problem): testcases = SubmissionTestCase.objects.filter(submission__problem=problem).all() @@ -21,52 +17,4 @@ def generate_report(problem): rate[i] = score[i] / total[i] for i, _ in sorted(rate.items(), key=lambda x: x[1], reverse=True): - print(i, score[i], total[i], rate[i]) - - -def import_users(csv_file): - # 1st row: username, password, name, organization - # ... row: a_username, passhere, my_name, organ - try: - f = open(csv_file, 'r') - except OSError: - print("Could not open csv file", csv_file) - return - - with f: - reader = csv.DictReader(f) - - for row in reader: - try: - username = row['username'] - pwd = row['password'] - except Exception: - print('username and/or password column missing') - print('Make sure your columns are: username, password, name, organization') - - user, created = User.objects.get_or_create(username=username, defaults={ - 'is_active': True, - }) - - profile, _ = Profile.objects.get_or_create(user=user, defaults={ - 'language': Language.get_python3(), - 'timezone': settings.DEFAULT_USER_TIME_ZONE, - }) - if created: - print('Created user', username) - - if pwd: - user.set_password(pwd) - elif created: - user.set_password('lqdoj') - print('User', username, 'missing password, default=lqdoj') - - if 'name' in row.keys() and row['name']: - user.first_name = row['name'] - - if 'organization' in row.keys() and row['organization']: - org = Organization.objects.get(name=row['organization']) - profile.organizations.add(org) - - user.save() - profile.save() + print(i, score[i], total[i], rate[i]) \ No newline at end of file diff --git a/judge/tasks/import_users.py b/judge/tasks/import_users.py new file mode 100644 index 0000000..aeaeca5 --- /dev/null +++ b/judge/tasks/import_users.py @@ -0,0 +1,100 @@ +import csv +from tempfile import mktemp + +from django.conf import settings +from django.contrib.auth.models import User + +from judge.models import Profile, Language, Organization + + +fields = ['username', 'password', 'name', 'school', 'email', 'organizations'] +descriptions = ['my_username(edit old one if exist)', + '123456 (must have)', + 'Le Van A (can be empty)', + 'Le Quy Don (can be empty)', + 'email@email.com (can be empty)', + 'org1&org2&org3&... (can be empty - org slug in URL)'] + +def csv_to_dict(csv_file): + rows = csv.reader(csv_file.read().decode().split('\n')) + header = next(rows) + header = [i.lower() for i in header] + + if 'username' not in header: + return [] + + res = [] + + for row in rows: + if len(row) != len(header): + continue + cur_dict = {i: '' for i in fields} + for i in range(len(header)): + if header[i] not in fields: + continue + cur_dict[header[i]] = row[i] + if cur_dict['username']: + res.append(cur_dict) + return res + + +# return result log +def import_users(users): + log = '' + for i, row in enumerate(users): + cur_log = str(i + 1) + '. ' + + username = row['username'] + cur_log += username + ': ' + + pwd = row['password'] + + user, created = User.objects.get_or_create(username=username, defaults={ + 'is_active': True, + }) + + profile, _ = Profile.objects.get_or_create(user=user, defaults={ + 'language': Language.get_python3(), + 'timezone': settings.DEFAULT_USER_TIME_ZONE, + }) + + if created: + cur_log += 'Create new - ' + else: + cur_log += 'Edit - ' + + if pwd: + user.set_password(pwd) + elif created: + user.set_password('lqdoj') + cur_log += 'Missing password, set password = lqdoj - ' + + if 'name' in row.keys() and row['name']: + user.first_name = row['name'] + + if 'school' in row.keys() and row['school']: + user.last_name = row['school'] + + if row['organizations']: + orgs = row['organizations'].split('&') + added_orgs = [] + for o in orgs: + try: + org = Organization.objects.get(slug=o) + profile.organizations.add(org) + added_orgs.append(org.name) + except Organization.DoesNotExist: + continue + if added_orgs: + cur_log += 'Added to ' + ', '.join(added_orgs) + ' - ' + + if row['email']: + user.email = row['email'] + + user.save() + profile.save() + cur_log += 'Saved\n' + log += cur_log + log += 'FINISH' + + return log \ No newline at end of file diff --git a/judge/utils/fine_uploader.py b/judge/utils/fine_uploader.py new file mode 100644 index 0000000..b38fcac --- /dev/null +++ b/judge/utils/fine_uploader.py @@ -0,0 +1,87 @@ +# https://github.com/FineUploader/server-examples/blob/master/python/django-fine-uploader + +from django.conf import settings +from django import forms +from django.forms import ClearableFileInput + +import os, os.path +import tempfile +import shutil + +__all__ = ( + 'handle_upload', 'save_upload', 'FineUploadForm', 'FineUploadFileInput' +) + + +def combine_chunks(total_parts, total_size, source_folder, dest): + if not os.path.exists(os.path.dirname(dest)): + os.makedirs(os.path.dirname(dest)) + + with open(dest, 'wb+') as destination: + for i in range(total_parts): + part = os.path.join(source_folder, str(i)) + with open(part, 'rb') as source: + destination.write(source.read()) + + +def save_upload(f, path): + if not os.path.exists(os.path.dirname(path)): + os.makedirs(os.path.dirname(path)) + with open(path, 'wb+') as destination: + if hasattr(f, 'multiple_chunks') and f.multiple_chunks(): + for chunk in f.chunks(): + destination.write(chunk) + else: + destination.write(f.read()) + + +# pass callback function to post_upload +def handle_upload(f, fileattrs, upload_dir, post_upload=None): + chunks_dir = os.path.join(tempfile.gettempdir(), 'chunk_upload_tmp') + if not os.path.exists(os.path.dirname(chunks_dir)): + os.makedirs(os.path.dirname(chunks_dir)) + chunked = False + dest_folder = upload_dir + dest = os.path.join(dest_folder, fileattrs['qqfilename']) + + # Chunked + if fileattrs.get('qqtotalparts') and int(fileattrs['qqtotalparts']) > 1: + chunked = True + dest_folder = os.path.join(chunks_dir, fileattrs['qquuid']) + dest = os.path.join(dest_folder, fileattrs['qqfilename'], str(fileattrs['qqpartindex'])) + save_upload(f, dest) + + # If the last chunk has been sent, combine the parts. + if chunked and (fileattrs['qqtotalparts'] - 1 == fileattrs['qqpartindex']): + combine_chunks(fileattrs['qqtotalparts'], + fileattrs['qqtotalfilesize'], + source_folder=os.path.dirname(dest), + dest=os.path.join(upload_dir, fileattrs['qqfilename'])) + shutil.rmtree(os.path.dirname(os.path.dirname(dest))) + + if post_upload and (not chunked or fileattrs['qqtotalparts'] - 1 == fileattrs['qqpartindex']): + post_upload() + + +class FineUploadForm(forms.Form): + qqfile = forms.FileField() + qquuid = forms.CharField() + qqfilename = forms.CharField() + qqpartindex = forms.IntegerField(required=False) + qqchunksize = forms.IntegerField(required=False) + qqpartbyteoffset = forms.IntegerField(required=False) + qqtotalfilesize = forms.IntegerField(required=False) + qqtotalparts = forms.IntegerField(required=False) + + +class FineUploadFileInput(ClearableFileInput): + template_name = 'widgets/fine_uploader.html' + def fine_uploader_id(self, name): + return name + '_' + 'fine_uploader' + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context['widget'].update({ + 'fine_uploader_id': self.fine_uploader_id(name), + }) + return context \ No newline at end of file diff --git a/judge/utils/problem_data.py b/judge/utils/problem_data.py index 5bf6341..e22aa4f 100644 --- a/judge/utils/problem_data.py +++ b/judge/utils/problem_data.py @@ -1,15 +1,17 @@ +import hashlib import json import os import re import shutil - import yaml +import zipfile + 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 _ - +from django.core.cache import cache VALIDATOR_TEMPLATE_PATH = 'validator_template/template.py' @@ -232,3 +234,61 @@ class ProblemDataCompiler(object): def generate(cls, *args, **kwargs): self = cls(*args, **kwargs) self.compile() + + +def get_visible_content(data): + data = data or b'' + data = data.replace(b'\r\n', b'\r').replace(b'\r', b'\n') + + data = data.decode('utf-8') + + if (len(data) > settings.TESTCASE_VISIBLE_LENGTH): + data = data[:settings.TESTCASE_VISIBLE_LENGTH] + data += '.' * 3 + return data + + +def get_file_cachekey(file): + return hashlib.sha1(file.encode()).hexdigest() + +def get_problem_case(problem, files): + result = {} + uncached_files = [] + + for file in files: + cache_key = 'problem_archive:%s:%s' % (problem.code, get_file_cachekey(file)) + qs = cache.get(cache_key) + if qs is None: + uncached_files.append(file) + else: + result[file] = qs + + if not uncached_files: + return result + + archive_path = os.path.join(settings.DMOJ_PROBLEM_DATA_ROOT, + str(problem.data_files.zipfile)) + if not os.path.exists(archive_path): + raise Exception( + 'archive file "%s" does not exist' % archive_path) + try: + archive = zipfile.ZipFile(archive_path, 'r') + except zipfile.BadZipfile: + raise Exception('bad archive: "%s"' % archive_path) + + for file in uncached_files: + cache_key = 'problem_archive:%s:%s' % (problem.code, get_file_cachekey(file)) + with archive.open(file) as f: + s = f.read(settings.TESTCASE_VISIBLE_LENGTH + 3) + # add this so there are no characters left behind (ex, 'á' = 2 utf-8 chars) + while True: + try: + s.decode('utf-8') + break + except UnicodeDecodeError: + s += f.read(1) + qs = get_visible_content(s) + cache.set(cache_key, qs, 86400) + result[file] = qs + + return result \ No newline at end of file diff --git a/judge/utils/problems.py b/judge/utils/problems.py index f87f807..ba846e6 100644 --- a/judge/utils/problems.py +++ b/judge/utils/problems.py @@ -1,6 +1,8 @@ from collections import defaultdict from math import e +import os, zipfile +from django.conf import settings 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 @@ -112,8 +114,8 @@ 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) + qs = Problem.get_public_problems() \ + .filter(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: @@ -144,4 +146,4 @@ def hot_problems(duration, limit): )).order_by('-ordering').defer('description')[:limit] cache.set(cache_key, qs, 900) - return qs + return qs \ No newline at end of file diff --git a/judge/utils/ranker.py b/judge/utils/ranker.py index b1a856a..52f0e4c 100644 --- a/judge/utils/ranker.py +++ b/judge/utils/ranker.py @@ -13,22 +13,3 @@ def ranker(iterable, key=attrgetter('points'), rank=0): 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/stats.py b/judge/utils/stats.py index cf3b251..ba923aa 100644 --- a/judge/utils/stats.py +++ b/judge/utils/stats.py @@ -51,3 +51,18 @@ def get_bar_chart(data, **kwargs): }, ], } + +def get_histogram(data, **kwargs): + return { + 'labels': [round(i, 1) for i in 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)), + }, + ], + } \ No newline at end of file diff --git a/judge/utils/views.py b/judge/utils/views.py index ba383ce..622f0e6 100644 --- a/judge/utils/views.py +++ b/judge/utils/views.py @@ -4,7 +4,7 @@ from django.views.generic import FormView from django.views.generic.detail import SingleObjectMixin from judge.utils.diggpaginator import DiggPaginator - +from django.utils.html import mark_safe def class_view_decorator(function_decorator): """Convert a function based decorator into a class based decorator usable diff --git a/judge/views/api/api_v1.py b/judge/views/api/api_v1.py index 93e7690..bad7486 100644 --- a/judge/views/api/api_v1.py +++ b/judge/views/api/api_v1.py @@ -16,10 +16,9 @@ def sane_time_repr(delta): 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') - + queryset = Contest.get_visible_contests(request.user).prefetch_related( + Prefetch('tags', queryset=ContestTag.objects.only('name'), to_attr='tag_list')) + return JsonResponse({c.key: { 'name': c.name, 'start_time': c.start_time.isoformat(), @@ -33,13 +32,10 @@ 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 - + can_see_rankings = contest.can_see_full_scoreboard(request.user) problems = list(contest.contest_problems.select_related('problem') .defer('problem__description').order_by('order')) - participations = (contest.users.filter(virtual=0, user__is_unlisted=False) + participations = (contest.users.filter(virtual=0) .prefetch_related('user__organizations') .annotate(username=F('user__user__username')) .order_by('-score', 'cumtime') if can_see_rankings else []) @@ -138,20 +134,20 @@ def api_v1_user_info(request, user): 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, - } + 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, mean, performance in participations.values_list( + 'contest__key', 'rating__rating', 'rating__mean', 'rating__performance', + ): + contest_history[contest_key] = { + 'rating': rating, + 'raw_rating': mean, + 'performance': performance, + } resp['contests'] = { 'current_rating': last_rating.rating if last_rating else None, - 'volatility': last_rating.volatility if last_rating else None, 'history': contest_history, } diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py index 7850d96..8e512b3 100644 --- a/judge/views/api/api_v2.py +++ b/judge/views/api/api_v2.py @@ -89,7 +89,6 @@ def api_v2_user_info(request): 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, } diff --git a/judge/views/blog.py b/judge/views/blog.py index 4244107..c16aa6e 100644 --- a/judge/views/blog.py +++ b/judge/views/blog.py @@ -57,7 +57,8 @@ class PostList(ListView): clarifications = ProblemClarification.objects.filter(problem__in=participation.contest.problems.all()) context['has_clarifications'] = clarifications.count() > 0 context['clarifications'] = clarifications.order_by('-date') - + if participation.contest.is_editable_by(self.request.user): + context['can_edit_contest'] = True 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) @@ -81,17 +82,14 @@ class PostList(ListView): .annotate(points=Max('points'), latest=Max('date')) .order_by('-latest') [:settings.DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT]) + + visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True) \ + .order_by('start_time') - 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) - q |= Q(view_contest_scoreboard=user) - visible_contests = visible_contests.filter(q) - context['current_contests'] = visible_contests.filter(start_time__lte=now, end_time__gt=now).distinct() - context['future_contests'] = visible_contests.filter(start_time__gt=now).distinct() + context['current_contests'] = visible_contests.filter(start_time__lte=now, end_time__gt=now) + context['future_contests'] = visible_contests.filter(start_time__gt=now) + visible_contests = Contest.get_visible_contests(self.request.user).filter(is_visible=True) if self.request.user.is_authenticated: profile = self.request.profile context['own_open_tickets'] = (Ticket.objects.filter(Q(user=profile) | Q(assignees__in=[profile]), is_open=True).order_by('-id') @@ -107,6 +105,7 @@ class PostList(ListView): context['open_tickets'] = filter_visible_tickets(tickets, self.request.user, profile)[:10] else: context['open_tickets'] = [] + return context diff --git a/judge/views/contests.py b/judge/views/contests.py index b68f137..0833a33 100644 --- a/judge/views/contests.py +++ b/judge/views/contests.py @@ -1,4 +1,5 @@ import json +import math from calendar import Calendar, SUNDAY from collections import defaultdict, namedtuple from datetime import date, datetime, time, timedelta @@ -12,15 +13,15 @@ from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMix 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 import Case, Count, F, 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.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse 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.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.functional import cached_property -from django.utils.html import format_html +from django.utils.html import format_html, escape from django.utils.safestring import mark_safe from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy @@ -31,19 +32,21 @@ 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, \ - Organization, Problem, Profile, Submission + Organization, Problem, Profile, Submission, ProblemClarification 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 +from judge.utils.stats import get_bar_chart, get_pie_chart, get_histogram +from judge.utils.views import DiggPaginatorMixin, QueryStringSortMixin, SingleObjectFormView, TitleMixin, \ + generic_message +from judge.widgets import HeavyPreviewPageDownWidget __all__ = ['ContestList', 'ContestDetail', 'ContestRanking', 'ContestJoin', 'ContestLeave', 'ContestCalendar', 'ContestClone', 'ContestStats', 'ContestMossView', 'ContestMossDelete', 'contest_ranking_ajax', 'ContestParticipationList', 'ContestParticipationDisqualify', 'get_contest_ranking_list', - 'base_contest_ranking_list'] + 'base_contest_ranking_list', 'ContestClarificationView'] def _find_contest(request, key, private_check=True): @@ -59,29 +62,18 @@ def _find_contest(request, key, private_check=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) - q |= Q(view_contest_scoreboard=self.request.profile) - queryset = queryset.filter(q) - return queryset.distinct() + return Contest.get_visible_contests(self.request.user) -class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): +class ContestList(QueryStringSortMixin, DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): model = Contest paginate_by = 20 template_name = 'contest/list.html' title = gettext_lazy('Contests') context_object_name = 'past_contests' - first_page_href = None + all_sorts = frozenset(('name', 'user_count', 'start_time')) + default_desc = frozenset(('name', 'user_count')) + default_sort = '-start_time' @cached_property def _now(self): @@ -101,7 +93,7 @@ class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): def _get_queryset(self): queryset = super(ContestList, self).get_queryset() \ - .order_by('-start_time', 'key').prefetch_related('tags', 'organizations', 'organizers') + .prefetch_related('tags', 'organizations', 'authors', 'curators', 'testers') if 'contest' in self.request.GET: self.contest_query = query = ' '.join(self.request.GET.getlist('contest')).strip() @@ -114,7 +106,7 @@ class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): return queryset def get_queryset(self): - return self._get_queryset().filter(end_time__lt=self._now) + return self._get_queryset().order_by(self.order, 'key').filter(end_time__lt=self._now) def get_context_data(self, **kwargs): context = super(ContestList, self).get_context_data(**kwargs) @@ -128,12 +120,15 @@ class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): 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'): + .select_related('contest') \ + .prefetch_related('contest__authors', 'contest__curators', 'contest__testers')\ + .annotate(key=F('contest__key')): if not participation.ended: active.append(participation) present.remove(participation.contest) - active.sort(key=attrgetter('end_time')) + active.sort(key=attrgetter('end_time', 'key')) + present.sort(key=attrgetter('end_time', 'key')) future.sort(key=attrgetter('start_time')) context['active_participations'] = active context['current_contests'] = present @@ -143,9 +138,8 @@ class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): context['contest_query'] = self.contest_query context['org_query'] = self.org_query context['organizations'] = Organization.objects.all() - context['page_suffix'] = suffix = ( - '?' + self.request.GET.urlencode()) if self.request.GET else '' - context['first_page_href'] = (self.first_page_href or '.') + suffix + context.update(self.get_sort_context()) + context.update(self.get_sort_paginate_context()) return context @@ -164,37 +158,44 @@ class ContestMixin(object): slug_url_kwarg = 'contest' @cached_property - def is_organizer(self): - return self.check_organizer() + def is_editor(self): + if not self.request.user.is_authenticated: + return False + return self.request.profile.id in self.object.editor_ids - 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) + @cached_property + def is_tester(self): + if not self.request.user.is_authenticated: + return False + return self.request.profile.id in self.object.tester_ids + + @cached_property + def can_edit(self): + return self.object.is_editable_by(self.request.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 + try: + context['live_participation'] = ( + self.request.profile.contest_history.get( + contest=self.object, + virtual=ContestParticipation.LIVE, + ) + ) + except ContestParticipation.DoesNotExist: + context['live_participation'] = None + context['has_joined'] = False 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 + context['has_joined'] = True else: - context['participating'] = False - context['participation'] = None - context['in_contest'] = False + context['live_participation'] = None + context['has_joined'] = False + context['now'] = timezone.now() - context['is_organizer'] = self.is_organizer + context['is_editor'] = self.is_editor + context['is_tester'] = self.is_tester + context['can_edit'] = self.can_edit if not self.object.og_image or not self.object.summary: metadata = generate_opengraph('generated-meta-contest:%d' % self.object.id, @@ -210,18 +211,22 @@ class ContestMixin(object): 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)): + try: + contest.access_check(self.request.user) + except Contest.PrivateContest: + raise PrivateContestError(contest.name, contest.is_private, contest.is_organization_private, + contest.organizations.all()) + except Contest.Inaccessible: raise Http404() - + else: + return contest + 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()) @@ -297,7 +302,7 @@ class ContestClone(ContestMixin, PermissionRequiredMixin, TitleMixin, SingleObje contest.organizations.set(organizations) contest.private_contestants.set(private_contestants) contest.view_contest_scoreboard.set(view_contest_scoreboard) - contest.organizers.add(self.request.profile) + contest.authors.add(self.request.profile) for problem in contest_problems: problem.contest = contest @@ -337,7 +342,7 @@ class ContestJoin(LoginRequiredMixin, ContestMixin, BaseDetailView): def join_contest(self, request, access_code=None): contest = self.object - if not contest.can_join and not self.is_organizer: + if not contest.can_join and not (self.is_editor or self.is_tester): return generic_message(request, _('Contest not ongoing'), _('"%s" is not currently ongoing.') % contest.name) @@ -351,8 +356,7 @@ class ContestJoin(LoginRequiredMixin, ContestMixin, BaseDetailView): _('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) + requires_access_code = (not self.can_edit and contest.access_code and access_code != contest.access_code) if contest.ended: if requires_access_code: raise ContestAccessDenied() @@ -371,22 +375,24 @@ class ContestJoin(LoginRequiredMixin, ContestMixin, BaseDetailView): else: break else: + SPECTATE = ContestParticipation.SPECTATE + LIVE = ContestParticipation.LIVE try: participation = ContestParticipation.objects.get( - contest=contest, user=profile, virtual=(-1 if self.is_organizer else 0), + contest=contest, user=profile, virtual=(SPECTATE if self.is_editor or self.is_tester else LIVE), ) 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), + contest=contest, user=profile, virtual=(SPECTATE if self.is_editor or self.is_tester else LIVE), real_start=timezone.now(), ) else: if participation.ended: participation = ContestParticipation.objects.get_or_create( - contest=contest, user=profile, virtual=-1, + contest=contest, user=profile, virtual=SPECTATE, defaults={'real_start': timezone.now()}, )[0] @@ -449,7 +455,7 @@ class ContestCalendar(TitleMixin, ContestListMixin, TemplateView): 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') + Q(end_time__gte=start, end_time__lt=end)) starts, ends, oneday = (defaultdict(list) for i in range(3)) for contest in contests: start_date = timezone.localtime(contest.start_time).date() @@ -523,6 +529,7 @@ class CachedContestCalendar(ContestCalendar): class ContestStats(TitleMixin, ContestMixin, DetailView): template_name = 'contest/stats.html' + POINT_BIN = 10 # in point distribution def get_title(self): return _('%s Statistics') % self.object.name @@ -530,7 +537,7 @@ class ContestStats(TitleMixin, ContestMixin, DetailView): 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)): + if not (self.object.ended or self.can_edit): raise Http404() queryset = Submission.objects.filter(contest_object=self.object) @@ -542,9 +549,10 @@ class ContestStats(TitleMixin, ContestMixin, DetailView): 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'), - ) + labels, codes = [], [] + contest_problems = self.object.contest_problems.order_by('order').values_list('problem__name', 'problem__code') + if contest_problems: + labels, codes = zip(*contest_problems) num_problems = len(labels) status_counts = [[] for i in range(num_problems)] for problem_code, result, count in status_count_queryset: @@ -556,6 +564,21 @@ class ContestStats(TitleMixin, ContestMixin, DetailView): for category in _get_result_data(defaultdict(int, status_counts[i]))['categories']: result_data[category['code']][i] = category['count'] + problem_points = [[] for _ in range(num_problems)] + point_count_queryset = list(queryset.values('problem__code', 'contest__points', 'contest__problem__points') + .annotate(count=Count('contest__points')) + .order_by('problem__code', 'contest__points') + .values_list('problem__code', 'contest__points', 'contest__problem__points', 'count')) + counter = [[0 for _ in range(self.POINT_BIN + 1)] for _ in range(num_problems)] + for problem_code, point, max_point, count in point_count_queryset: + if (point == None) or (problem_code not in codes): continue + problem_idx = codes.index(problem_code) + bin_idx = math.floor(point * self.POINT_BIN / max_point) + counter[problem_idx][bin_idx] += count + for i in range(num_problems): + problem_points[i] = [(j * 100 / self.POINT_BIN, counter[i][j]) + for j in range(len(counter[i]))] + stats = { 'problem_status_count': { 'labels': labels, @@ -572,6 +595,9 @@ class ContestStats(TitleMixin, ContestMixin, DetailView): queryset.values('contest__problem__order', 'problem__name').annotate(ac_rate=ac_rate) .order_by('contest__problem__order').values_list('problem__name', 'ac_rate'), ), + 'problem_point': [get_histogram(problem_points[i]) + for i in range(num_problems) + ], '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'), @@ -583,13 +609,13 @@ class ContestStats(TitleMixin, ContestMixin, DetailView): } context['stats'] = mark_safe(json.dumps(stats)) - + context['problems'] = labels return context ContestRankingProfile = namedtuple( 'ContestRankingProfile', - 'id user css_class username points cumtime organization participation ' + 'id user css_class username points cumtime tiebreaker organization participation ' 'participation_rating problem_cells result_cell', ) @@ -605,6 +631,7 @@ def make_contest_ranking_profile(contest, participation, contest_problems): username=user.username, points=participation.score, cumtime=participation.cumtime, + tiebreaker=participation.tiebreaker, organization=user.organization, participation_rating=participation.rating.rating if hasattr(participation, 'rating') else None, problem_cells=[contest.format.display_user_problem(participation, contest_problem) @@ -619,22 +646,20 @@ def base_contest_ranking_list(contest, problems, queryset): 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) +def contest_ranking_list(contest, problems, queryset=None): + if not queryset: + queryset = contest.users.filter(virtual=0) + return base_contest_ranking_list(contest, problems, queryset .prefetch_related('user__organizations') .extra(select={'round_score': 'round(score, 6)'}) - .order_by('is_disqualified', '-round_score', 'cumtime')) + .order_by('is_disqualified', '-round_score', 'cumtime', 'tiebreaker')) def get_contest_ranking_list(request, contest, participation=None, ranking_list=contest_ranking_list, - show_current_virtual=True, ranker=ranker): + show_current_virtual=False, 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')) + users = ranker(ranking_list(contest, problems), key=attrgetter('points', 'cumtime', 'tiebreaker')) if show_current_virtual: if participation is None and request.user.is_authenticated: @@ -651,15 +676,24 @@ def contest_ranking_ajax(request, contest, participation=None): if not exists: return HttpResponseBadRequest('Invalid contest', content_type='text/plain') - if not contest.can_see_scoreboard(request.user): + if not contest.can_see_full_scoreboard(request.user): raise Http404() - users, problems = get_contest_ranking_list(request, contest, participation) + queryset = contest.users.filter(virtual__gte=0) + if request.GET.get('friend') == 'true' and request.profile: + friends = list(request.profile.get_friends()) + queryset = queryset.filter(user__user__username__in=friends) + if request.GET.get('virtual') != 'true': + queryset = queryset.filter(virtual=0) + + users, problems = get_contest_ranking_list(request, contest, participation, + ranking_list=partial(contest_ranking_list, queryset=queryset)) return render(request, 'contest/ranking-table.html', { 'users': users, 'problems': problems, 'contest': contest, 'has_rating': contest.ratings.exists(), + 'can_edit': contest.is_editable_by(request.user) }) @@ -679,13 +713,12 @@ class ContestRankingBase(ContestMixin, TitleMixin, DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - if not self.object.can_see_scoreboard(self.request.user): + if not self.object.can_see_own_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 @@ -697,6 +730,14 @@ class ContestRanking(ContestRankingBase): return _('%s Rankings') % self.object.name def get_ranking_list(self): + if not self.object.can_see_full_scoreboard(self.request.user): + queryset = self.object.users.filter(user=self.request.profile, virtual=ContestParticipation.LIVE) + return get_contest_ranking_list( + self.request, self.object, + ranking_list=partial(base_contest_ranking_list, queryset=queryset), + ranker=lambda users, key: ((_('???'), user) for user in users), + ) + return get_contest_ranking_list(self.request, self.object) def get_context_data(self, **kwargs): @@ -714,6 +755,9 @@ class ContestParticipationList(LoginRequiredMixin, ContestRankingBase): return _("%s's participation in %s") % (self.profile.username, self.object.name) def get_ranking_list(self): + if not self.object.can_see_full_scoreboard(self.request.user) and self.profile != self.request.profile: + raise Http404() + 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])) @@ -728,6 +772,7 @@ class ContestParticipationList(LoginRequiredMixin, ContestRankingBase): context['has_rating'] = False context['now'] = timezone.now() context['rank_header'] = _('Participation') + context['participation_tab'] = True return context def get(self, request, *args, **kwargs): @@ -762,7 +807,7 @@ class ContestMossMixin(ContestMixin, PermissionRequiredMixin): def get_object(self, queryset=None): contest = super().get_object(queryset) - if settings.MOSS_API_KEY is None: + if settings.MOSS_API_KEY is None or not contest.is_editable_by(self.request.user): raise Http404() if not contest.is_editable_by(self.request.user): raise Http404() @@ -824,3 +869,87 @@ class ContestTagDetail(TitleMixin, ContestTagDetailAjax): def get_title(self): return _('Contest tag: %s') % self.object.name + + +class ProblemClarificationForm(forms.Form): + body = forms.CharField(widget=HeavyPreviewPageDownWidget(preview=reverse_lazy('comment_preview'), + preview_timeout=1000, hide_preview_button=True)) + + def __init__(self, request, *args, **kwargs): + self.request = request + super(ProblemClarificationForm, self).__init__(*args, **kwargs) + self.fields['body'].widget.attrs.update({'placeholder': _('Issue description')}) + + +class NewContestClarificationView(ContestMixin, TitleMixin, SingleObjectFormView): + form_class = ProblemClarificationForm + template_name = 'contest/clarification.html' + + def get_form_kwargs(self): + kwargs = super(NewContestClarificationView, self).get_form_kwargs() + kwargs['request'] = self.request + return kwargs + + def is_accessible(self): + if not self.request.user.is_authenticated: + return False + if not self.request.in_contest: + return False + if not self.request.participation.contest == self.get_object(): + return False + return self.request.user.is_superuser or \ + self.request.profile in self.request.participation.contest.authors.all() or \ + self.request.profile in self.request.participation.contest.curators.all() + + def get(self, request, *args, **kwargs): + if not self.is_accessible(): + raise Http404() + return super().get(self, request, *args, **kwargs) + + def form_valid(self, form): + problem_code = self.request.POST['problem'] + description = form.cleaned_data['body'] + + clarification = ProblemClarification(description=description) + clarification.problem = Problem.objects.get(code=problem_code) + clarification.save() + + link = reverse('home') + return HttpResponseRedirect(link) + + def get_title(self): + return "New clarification for %s" % self.object.name + + def get_content_title(self): + return mark_safe(escape(_('New clarification for %s')) % + format_html('{1}', reverse('problem_detail', args=[self.object.key]), + self.object.name)) + + def get_context_data(self, **kwargs): + context = super(NewContestClarificationView, self).get_context_data(**kwargs) + context['problems'] = ContestProblem.objects.filter(contest=self.object)\ + .order_by('order') + return context + + +class ContestClarificationAjax(ContestMixin, DetailView): + def get(self, request, *args, **kwargs): + self.object = self.get_object() + if not self.object.is_accessible_by(request.user): + raise Http404() + + polling_time = 1 # minute + last_one_minute = last_five_minutes = timezone.now()-timezone.timedelta(minutes=polling_time) + + queryset = list(ProblemClarification.objects.filter( + problem__in=self.object.problems.all(), + date__gte=last_one_minute + ).values('problem', 'problem__name', 'description')) + + problems = list(ContestProblem.objects.filter(contest=self.object)\ + .order_by('order').values('problem')) + problems = [i['problem'] for i in problems] + for cla in queryset: + cla['order'] = self.object.get_label_for_problem(problems.index(cla['problem'])) + + return JsonResponse(queryset, safe=False, json_dumps_params={'ensure_ascii': False}) diff --git a/judge/views/organization.py b/judge/views/organization.py index 96a98fd..057e617 100644 --- a/judge/views/organization.py +++ b/judge/views/organization.py @@ -11,6 +11,7 @@ from django.forms import Form, modelformset_factory from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect from django.urls import reverse from django.utils import timezone +from django.utils.safestring import mark_safe 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 @@ -114,6 +115,7 @@ class OrganizationHome(OrganizationDetailView): 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() } + context['pending_count'] = OrganizationRequest.objects.filter(state='P', organization=self.object).count() return context @@ -230,7 +232,7 @@ class OrganizationRequestDetail(LoginRequiredMixin, TitleMixin, DetailView): OrganizationRequestFormSet = modelformset_factory(OrganizationRequest, extra=0, fields=('state',), can_delete=True) -class OrganizationRequestBaseView(LoginRequiredMixin, SingleObjectTemplateResponseMixin, SingleObjectMixin, View): +class OrganizationRequestBaseView(TitleMixin, LoginRequiredMixin, SingleObjectTemplateResponseMixin, SingleObjectMixin, View): model = Organization slug_field = 'key' slug_url_kwarg = 'key' @@ -243,6 +245,10 @@ class OrganizationRequestBaseView(LoginRequiredMixin, SingleObjectTemplateRespon raise PermissionDenied() return organization + def get_content_title(self): + href = reverse('organization_home', args=[self.object.id, self.object.slug]) + return mark_safe(f'Manage join requests for {self.object.name}') + def get_context_data(self, **kwargs): context = super(OrganizationRequestBaseView, self).get_context_data(**kwargs) context['title'] = _('Managing join requests for %s') % self.object.name diff --git a/judge/views/problem.py b/judge/views/problem.py index fbb2721..de07cbe 100644 --- a/judge/views/problem.py +++ b/judge/views/problem.py @@ -21,14 +21,14 @@ 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 import DetailView, 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, \ +from judge.models import ContestProblem, ContestSubmission, Judge, Language, Problem, ProblemClarification, \ + ProblemGroup, ProblemTranslation, ProblemType, RuntimeVersion, Solution, Submission, SubmissionSource, \ TranslatedProblemForeignKeyQuerySet, Organization from judge.pdf_problems import DefaultPdfMaker, HAS_PDF from judge.utils.diggpaginator import DiggPaginator @@ -154,13 +154,10 @@ class ProblemRaw(ProblemMixin, TitleMixin, TemplateResponseMixin, SingleObjectMi )) -class ProblemDetail(ProblemMixin, SolvedProblemMixin, CommentedDetailView): +class ProblemDetail(ProblemMixin, SolvedProblemMixin, DetailView): 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 @@ -170,6 +167,7 @@ class ProblemDetail(ProblemMixin, SolvedProblemMixin, CommentedDetailView): 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 @@ -220,6 +218,21 @@ class ProblemDetail(ProblemMixin, SolvedProblemMixin, CommentedDetailView): return context +class ProblemComments(ProblemMixin, TitleMixin, CommentedDetailView): + context_object_name = 'problem' + template_name = 'problem/comments.html' + + def get_title(self): + return _('Disscuss {0}').format(self.object.name) + + def get_content_title(self): + return format_html(_(u'Discuss {0}'), self.object.name, + reverse('problem_detail', args=[self.object.code])) + + def get_comment_page(self): + return 'p:%s' % self.object.code + + class LatexError(Exception): pass @@ -256,7 +269,6 @@ class ProblemPdfView(ProblemMixin, SingleObjectMixin, View): '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') @@ -267,7 +279,6 @@ class ProblemPdfView(ProblemMixin, SingleObjectMixin, View): 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/'): @@ -438,7 +449,17 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView else: context['hot_problems'] = None context['point_start'], context['point_end'], context['point_values'] = 0, 0, {} - context['hide_contest_scoreboard'] = self.contest.hide_scoreboard + context['hide_contest_scoreboard'] = self.contest.scoreboard_visibility in \ + (self.contest.SCOREBOARD_AFTER_CONTEST, self.contest.SCOREBOARD_AFTER_PARTICIPATION) + 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') + if participation.contest.is_editable_by(self.request.user): + context['can_edit_contest'] = True return context def get_noui_slider_points(self): diff --git a/judge/views/problem_data.py b/judge/views/problem_data.py index 00bd38c..7671e7f 100644 --- a/judge/views/problem_data.py +++ b/judge/views/problem_data.py @@ -2,14 +2,24 @@ import json import mimetypes import os from itertools import chain +import shutil +from tempfile import gettempdir from zipfile import BadZipfile, ZipFile +from django import forms +from django.conf import settings +from django.http import HttpResponse, HttpRequest +from django.shortcuts import render +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View + from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.files import File from django.core.exceptions import ValidationError from django.forms import BaseModelFormSet, HiddenInput, ModelForm, NumberInput, Select, formset_factory, FileInput -from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.http import Http404, HttpResponse, HttpResponseRedirect, JsonResponse from django.shortcuts import get_object_or_404, render from django.urls import reverse from django.utils.html import escape, format_html @@ -22,6 +32,7 @@ from judge.models import Problem, ProblemData, ProblemTestCase, Submission, prob from judge.utils.problem_data import ProblemDataCompiler from judge.utils.unicode import utf8text from judge.utils.views import TitleMixin +from judge.utils.fine_uploader import combine_chunks, save_upload, handle_upload, FineUploadFileInput, FineUploadForm from judge.views.problem import ProblemMixin mimetypes.init() @@ -52,6 +63,7 @@ class ProblemDataForm(ModelForm): model = ProblemData fields = ['zipfile', 'checker', 'checker_args', 'custom_checker', 'custom_validator'] widgets = { + 'zipfile': FineUploadFileInput, 'checker_args': HiddenInput, 'generator': HiddenInput, 'output_limit': HiddenInput, @@ -76,6 +88,7 @@ class ProblemCaseForm(ModelForm): } + class ProblemCaseFormSet(formset_factory(ProblemCaseForm, formset=BaseModelFormSet, extra=1, max_num=1, can_delete=True)): model = ProblemTestCase @@ -242,3 +255,39 @@ def problem_init_view(request, problem): format_html('{0}', problem.name, reverse('problem_detail', args=[problem.code])))), }) + + +class ProblemZipUploadView(ProblemManagerMixin, View): + def dispatch(self, *args, **kwargs): + return super(ProblemZipUploadView, self).dispatch(*args, **kwargs) + + def post(self, request, *args, **kwargs): + self.object = problem = self.get_object() + problem_data = get_object_or_404(ProblemData, problem=self.object) + form = FineUploadForm(request.POST, request.FILES) + + if form.is_valid(): + fileuid = form.cleaned_data['qquuid'] + filename = form.cleaned_data['qqfilename'] + dest = os.path.join(gettempdir(), fileuid) + + def post_upload(): + zip_dest = os.path.join(dest, filename) + try: + ZipFile(zip_dest).namelist() # check if this file is valid + with open(zip_dest, 'rb') as f: + problem_data.zipfile.delete() + problem_data.zipfile.save(filename, File(f)) + f.close() + except Exception as e: + raise Exception(e) + finally: + shutil.rmtree(dest) + + try: + handle_upload(request.FILES['qqfile'], form.cleaned_data, dest, post_upload=post_upload) + except Exception as e: + return JsonResponse({'success': False, 'error': str(e)}) + return JsonResponse({'success': True}) + else: + return HttpResponse(status_code=400) \ No newline at end of file diff --git a/judge/views/register.py b/judge/views/register.py index 67c1c4f..e7ba8c9 100644 --- a/judge/views/register.py +++ b/judge/views/register.py @@ -40,6 +40,16 @@ class CustomRegistrationForm(RegistrationForm): if ReCaptchaField is not None: captcha = ReCaptchaField(widget=ReCaptchaWidget()) + def clean_organizations(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 forms.ValidationError( + _('You may not be part of more than {count} public organizations.').format(count=max_orgs)) + + return self.cleaned_data['organizations'] + 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 ' @@ -71,7 +81,7 @@ class RegistrationView(OldRegistrationView): def register(self, form): user = super(RegistrationView, self).register(form) profile, _ = Profile.objects.get_or_create(user=user, defaults={ - 'language': Language.get_python3(), + 'language': Language.get_default_language(), }) cleaned_data = form.cleaned_data diff --git a/judge/views/select2.py b/judge/views/select2.py index cf8e249..1a0bece 100644 --- a/judge/views/select2.py +++ b/judge/views/select2.py @@ -4,6 +4,8 @@ from django.shortcuts import get_object_or_404 from django.utils.encoding import smart_text from django.views.generic.list import BaseListView +from chat_box.utils import encrypt_url + from judge.jinja2.gravatar import gravatar from judge.models import Comment, Contest, Organization, Problem, Profile @@ -54,29 +56,14 @@ class OrganizationSelect2View(Select2View): 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() + return Problem.get_visible_problems(self.request.user) \ + .filter(Q(code__icontains=self.term) | Q(name__icontains=self.term)).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) - q |= Q(view_contest_scoreboard=self.request.profile) - queryset = queryset.filter(q) - return queryset + return Contest.get_visible_contests(self.request.user) \ + .filter(Q(key__icontains=self.term) | Q(name__icontains=self.term)) class CommentSelect2View(Select2View): @@ -119,8 +106,7 @@ class UserSearchSelect2View(BaseListView): 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): + if not contest.is_accessible_by(self.request.user) or not contest.can_see_full_scoreboard(self.request.user): raise Http404() return Profile.objects.filter(contest_history__contest=contest, @@ -137,3 +123,35 @@ class AssigneeSelect2View(UserSearchSelect2View): def get_queryset(self): return Profile.objects.filter(assigned_tickets__isnull=False, user__username__icontains=self.term).distinct() + + +class ChatUserSearchSelect2View(BaseListView): + paginate_by = 20 + + def get_queryset(self): # TODO: add block + 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': encrypt_url(request.profile.id, pk), + '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) \ No newline at end of file diff --git a/judge/views/submission.py b/judge/views/submission.py index 6c7d9e6..1c10872 100644 --- a/judge/views/submission.py +++ b/judge/views/submission.py @@ -43,7 +43,8 @@ from judge.utils.problems import get_result_data from judge.utils.problems import user_authored_ids from judge.utils.problems import user_completed_ids from judge.utils.problems import user_editable_ids -from judge.utils.raw_sql import use_straight_join +from judge.utils.problem_data import get_problem_case +from judge.utils.raw_sql import join_sql_subquery, use_straight_join from judge.utils.views import DiggPaginatorMixin from judge.utils.views import TitleMixin @@ -110,7 +111,7 @@ class SubmissionSource(SubmissionDetailBase): submission = self.object context['raw_source'] = submission.source.source.rstrip('\n') context['highlighted_source'] = highlight_code( - submission.source.source, submission.language.pygments) + submission.source.source, submission.language.pygments, linenos=False) return context @@ -137,60 +138,28 @@ def group_test_cases(cases): return result -def read_head_archive(archive, file): - with archive.open(file) as f: - s = f.read(settings.TESTCASE_VISIBLE_LENGTH + 3) - # add this so there are no characters left behind (ex, 'á' = 2 utf-8 chars) - while True: - try: - s.decode('utf-8') - break - except UnicodeDecodeError: - s += f.read(1) - return s - - -def get_visible_content(data): - data = data or b'' - data = data.replace(b'\r\n', b'\r').replace(b'\r', b'\n') - - data = data.decode('utf-8') - - if (len(data) > settings.TESTCASE_VISIBLE_LENGTH): - data = data[:settings.TESTCASE_VISIBLE_LENGTH] - data += '.' * 3 - return data - - -def get_input_answer(case, archive): - result = {'input': '', 'answer': ''} - if (len(case.input_file)): - result['input'] = get_visible_content(read_head_archive(archive, case.input_file)) - if (len(case.output_file)): - result['answer'] = get_visible_content(read_head_archive(archive, case.output_file)) - return result - - -def get_problem_data(submission): - archive_path = os.path.join(settings.DMOJ_PROBLEM_DATA_ROOT, - str(submission.problem.data_files.zipfile)) - if not os.path.exists(archive_path): - raise Exception( - 'archive file "%s" does not exist' % archive_path) - try: - archive = zipfile.ZipFile(archive_path, 'r') - except zipfile.BadZipfile: - raise Exception('bad archive: "%s"' % archive_path) - +def get_cases_data(submission): testcases = ProblemTestCase.objects.filter(dataset=submission.problem)\ .order_by('order') - + if (submission.is_pretested): testcases = testcases.filter(is_pretest=True) + files = [] + for case in testcases: + if case.input_file: files.append(case.input_file) + if case.output_file: files.append(case.output_file) + case_data = get_problem_case(submission.problem, files) + problem_data = {} - for count, case in enumerate(testcases): - problem_data[count + 1] = get_input_answer(case, archive) + count = 0 + for case in testcases: + if case.type != 'C': continue + count += 1 + problem_data[count] = { + 'input': case_data[case.input_file] if case.input_file else '', + 'answer': case_data[case.output_file] if case.output_file else '', + } return problem_data @@ -198,20 +167,36 @@ def get_problem_data(submission): class SubmissionStatus(SubmissionDetailBase): template_name = 'submission/status.html' + def access_testcases_in_contest(self): + contest = self.object.contest_or_none + if contest is None: + return False + if contest.problem.problem.is_editable_by(self.request.user): + return True + if contest.problem.contest.is_in_contest(self.request.user): + return False + if contest.participation.ended: + return True + return False + 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 - + context['can_see_testcases'] = False + contest = submission.contest_or_none prefix_length = 0 + can_see_testcases = self.access_testcases_in_contest() + if (contest is not None): prefix_length = contest.problem.output_prefix_override - if ((contest is None or prefix_length > 0) or self.request.user.is_superuser): - context['cases_data'] = get_problem_data(submission) - + + if contest is None or prefix_length > 0 or can_see_testcases: + context['cases_data'] = get_cases_data(submission) + context['can_see_testcases'] = True try: lang_limit = submission.problem.language_limits.get( language=submission.language) @@ -292,11 +277,9 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): 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) + queryset = queryset.filter(contest_object=self.contest) + if not self.contest.can_see_full_scoreboard(self.request.user): + queryset = queryset.filter(user=self.request.profile) else: queryset = queryset.select_related( 'contest_object').defer('contest_object__description') @@ -304,12 +287,18 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): # 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)) + # Show submissions for any contest you can edit or visible scoreboard + contest_queryset = Contest.objects.filter(Q(authors=self.request.profile) | + Q(curators=self.request.profile) | + Q(scoreboard_visibility=Contest.SCOREBOARD_VISIBLE) | + Q(end_time__lt=timezone.now())).distinct() + queryset = queryset.filter(Q(user=self.request.profile) | + Q(contest_object__in=contest_queryset) | + Q(contest_object__isnull=True)) if self.selected_languages: queryset = queryset.filter( - language_id__in=Language.objects.filter(key__in=self.selected_languages)) + language__in=Language.objects.filter(key__in=self.selected_languages)) if self.selected_statuses: queryset = queryset.filter(result__in=self.selected_statuses) @@ -318,14 +307,13 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): 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) + join_sql_subquery( + queryset, + subquery=str(Problem.get_visible_problems(self.request.user).distinct().only('id').query), + params=[], + join_fields=[('problem_id', 'id')], + alias='visible_problems', + ) return queryset def get_my_submissions_page(self): @@ -452,7 +440,7 @@ class ProblemSubmissionsBase(SubmissionsListBase): 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): + if self.in_contest and not self.contest.can_see_own_scoreboard(request.user): raise Http404() def access_check(self, request): diff --git a/judge/views/user.py b/judge/views/user.py index 927ece8..b874d65 100644 --- a/judge/views/user.py +++ b/judge/views/user.py @@ -13,7 +13,8 @@ from django.db import transaction from django.db.models import Count, Max, Min from django.db.models.fields import DateField from django.db.models.functions import Cast, ExtractYear -from django.http import Http404, HttpResponseRedirect, JsonResponse +from django.forms import Form +from django.http import Http404, HttpResponseRedirect, JsonResponse, HttpResponseForbidden, HttpResponseBadRequest, HttpResponse from django.shortcuts import get_object_or_404, render from django.urls import reverse from django.utils import timezone @@ -21,18 +22,21 @@ 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 import View from django.views.generic import DetailView, ListView, TemplateView +from django.template.loader import render_to_string from reversion import revisions from judge.forms import ProfileForm, newsletter_id from judge.models import Profile, Rating, Submission, Friend from judge.performance_points import get_pp_breakdown from judge.ratings import rating_class, rating_progress +from judge.tasks import import_users 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 judge.utils.views import DiggPaginatorMixin, QueryStringSortMixin, TitleMixin, generic_message, SingleObjectFormView from .contests import ContestRanking __all__ = ['UserPage', 'UserAboutPage', 'UserProblemsPage', 'users', 'edit_profile'] @@ -74,6 +78,11 @@ class UserPage(TitleMixin, UserMixin, DetailView): return (_('My account') if self.request.user == self.object.user else _('User %s') % self.object.user.username) + def get_content_title(self): + username = self.object.user.username + css_class = self.object.css_class + return mark_safe(f'{username}') + # TODO: the same code exists in problem.py, maybe move to problems.py? @cached_property def profile(self): @@ -126,6 +135,28 @@ EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc) class UserAboutPage(UserPage): template_name = 'user/user-about.html' + def get_awards(self, ratings): + result = {} + + sorted_ratings = sorted(ratings, + key=lambda x: (x.rank, -x.contest.end_time.timestamp())) + + result['medals'] = [{ + 'label': rating.contest.name, + 'ranking': rating.rank, + 'link': reverse('contest_ranking', args=(rating.contest.key,)) + '#!' + self.object.username, + 'date': date_format(rating.contest.end_time, _('M j, Y')), + } for rating in sorted_ratings if rating.rank <= 3] + + num_awards = 0 + for i in result: + num_awards += len(result[i]) + + if num_awards == 0: + result = None + + return result + 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') \ @@ -142,6 +173,8 @@ class UserAboutPage(UserPage): 'height': '%.3fem' % rating_progress(rating.rating), } for rating in ratings])) + context['awards'] = self.get_awards(ratings) + if ratings: user_data = self.object.ratings.aggregate(Min('rating'), Max('rating')) global_data = Rating.objects.aggregate(Min('rating'), Max('rating')) @@ -285,7 +318,9 @@ def edit_profile(request): form.fields['test_site'].initial = request.user.has_perm('judge.test_site') tzmap = settings.TIMEZONE_MAP + print(settings.REGISTER_NAME_URL) return render(request, 'user/edit-profile.html', { + 'edit_name_url': settings.REGISTER_NAME_URL, 'require_staff_2fa': settings.DMOJ_REQUIRE_STAFF_2FA, 'form': form, 'title': _('Edit profile'), 'profile': profile, 'has_math_config': bool(settings.MATHOID_URL), @@ -367,3 +402,56 @@ class UserLogoutView(TitleMixin, TemplateView): def post(self, request, *args, **kwargs): auth_logout(request) return HttpResponseRedirect(request.get_full_path()) + + +class ImportUsersView(TitleMixin, TemplateView): + template_name = 'user/import/index.html' + title = _('Import Users') + + def get(self, *args, **kwargs): + if self.request.user.is_superuser: + return super().get(self, *args, **kwargs) + return HttpResponseForbidden() + + +def import_users_post_file(request): + if not request.user.is_superuser or request.method != 'POST': + return HttpResponseForbidden() + users = import_users.csv_to_dict(request.FILES['csv_file']) + + if not users: + return JsonResponse({ + 'done': False, + 'msg': 'No valid row found. Make sure row containing username.' + }) + + table_html = render_to_string('user/import/table_csv.html', { + 'data': users + }) + return JsonResponse({ + 'done': True, + 'html': table_html, + 'data': users + }) + + +def import_users_submit(request): + import json + if not request.user.is_superuser or request.method != 'POST': + return HttpResponseForbidden() + + users = json.loads(request.body)['users'] + log = import_users.import_users(users) + return JsonResponse({ + 'msg': log + }) + + +def sample_import_users(request): + if not request.user.is_superuser or request.method != 'GET': + return HttpResponseForbidden() + filename = 'import_sample.csv' + content = ','.join(import_users.fields) + '\n' + ','.join(import_users.descriptions) + response = HttpResponse(content, content_type='text/plain') + response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) + return response \ No newline at end of file diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 43b481f..12d2bd5 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Arabic, Saudi Arabia\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: ar-SA\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -141,46 +141,48 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -191,11 +193,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -206,11 +208,11 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -221,7 +223,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -232,15 +234,15 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -248,15 +250,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -278,8 +280,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -344,6 +347,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -380,7 +384,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -427,7 +431,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -442,8 +446,8 @@ msgstr[5] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -454,8 +458,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -469,7 +474,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -518,6 +523,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -530,7 +539,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -542,11 +551,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -566,7 +577,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -574,12 +585,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -641,7 +652,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -678,431 +689,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1142,7 +1195,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1150,7 +1203,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1174,15 +1227,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1342,7 +1399,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1415,188 +1472,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1669,7 +1726,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1765,31 +1822,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1880,86 +1937,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1988,7 +2045,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2181,12 +2238,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2198,60 +2264,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2306,8 +2372,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2315,7 +2381,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2332,7 +2398,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2340,131 +2406,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2494,73 +2569,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2571,7 +2647,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2582,84 +2658,85 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2700,22 +2777,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2768,24 +2845,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2801,13 +2878,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2861,10 +2938,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2915,42 +2988,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2988,7 +3069,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -3003,53 +3084,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3057,6 +3138,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3065,76 +3151,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3167,7 +3255,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3255,6 +3344,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3284,7 +3378,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3297,7 +3391,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3309,29 +3403,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3363,62 +3456,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3469,15 +3584,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3489,39 +3608,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3630,58 +3757,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3714,7 +3866,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3750,35 +3902,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3790,28 +3942,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3820,86 +3976,88 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3910,67 +4068,63 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" @@ -3980,7 +4134,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" @@ -3990,16 +4144,16 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" @@ -4009,23 +4163,28 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4053,25 +4212,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4242,20 +4401,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4313,6 +4472,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4328,6 +4488,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4343,6 +4504,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4359,10 +4528,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4419,63 +4584,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4500,11 +4666,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4528,7 +4694,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4543,34 +4709,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4619,6 +4785,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4637,31 +4823,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4672,31 +4834,116 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/ar/LC_MESSAGES/djangojs.po b/locale/ar/LC_MESSAGES/djangojs.po index e2a3d5f..82d2d43 100644 --- a/locale/ar/LC_MESSAGES/djangojs.po +++ b/locale/ar/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Arabic, Saudi Arabia\n" @@ -10,7 +10,8 @@ msgstr "" "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" +"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" @@ -31,4 +32,3 @@ msgstr[5] "" 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 index 9ac1521..f1ea49d 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: German\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: de\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Deutsch" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Englisch" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Französisch" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Rumänisch" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Russisch" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Chinesisch (vereinfacht)" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -132,90 +132,92 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -223,15 +225,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "Systematik" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -311,6 +314,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -343,7 +347,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -390,7 +394,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -413,8 +417,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -428,7 +433,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -501,11 +510,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -525,7 +536,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -533,12 +544,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -600,7 +611,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -637,431 +648,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1101,7 +1154,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1109,7 +1162,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1133,15 +1186,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1301,7 +1358,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1374,188 +1431,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1628,7 +1685,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1724,31 +1781,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1839,86 +1896,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1947,7 +2004,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2140,12 +2197,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2157,60 +2223,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2253,8 +2319,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2262,7 +2328,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2279,7 +2345,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2287,131 +2353,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2441,164 +2516,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2639,22 +2716,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2703,24 +2780,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2736,13 +2813,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2796,10 +2873,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2850,42 +2923,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2923,7 +3004,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2938,53 +3019,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2992,6 +3073,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3000,78 +3086,80 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online" msgid "Online Users" msgstr "Online" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3104,7 +3192,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3192,6 +3281,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3221,7 +3315,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3234,7 +3328,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3246,29 +3340,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3300,62 +3393,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3406,15 +3521,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3426,39 +3545,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3567,58 +3694,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3651,7 +3803,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3687,35 +3839,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3727,28 +3879,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3757,153 +3913,151 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 #, fuzzy #| msgid "Authors" msgid "Author:" @@ -3911,44 +4065,49 @@ msgid_plural "Authors:" msgstr[0] "Autoren" msgstr[1] "Autoren" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3976,25 +4135,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4161,20 +4320,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4232,6 +4391,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4247,6 +4407,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4262,6 +4423,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4278,10 +4447,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4338,63 +4503,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4419,11 +4585,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4447,7 +4613,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4462,34 +4628,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4538,6 +4704,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4556,62 +4742,123 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/de/LC_MESSAGES/djangojs.po b/locale/de/LC_MESSAGES/djangojs.po index 8c9c3ad..7937ae0 100644 --- a/locale/de/LC_MESSAGES/djangojs.po +++ b/locale/de/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-04-08 21:06-0500\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: German\n" diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 2599424..9bcad4c 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,93 +18,93 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -134,90 +134,92 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -225,15 +227,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -255,8 +257,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -313,6 +316,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -345,7 +349,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -392,7 +396,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -403,8 +407,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -415,8 +419,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -430,7 +435,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -479,6 +484,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -491,7 +500,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -503,11 +512,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -527,7 +538,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -535,12 +546,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -602,7 +613,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -639,431 +650,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1103,7 +1156,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1111,7 +1164,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1135,15 +1188,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1303,7 +1360,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1376,188 +1433,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1630,7 +1687,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1726,31 +1783,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1841,86 +1898,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1949,7 +2006,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2142,12 +2199,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2159,60 +2225,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2255,8 +2321,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2264,7 +2330,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2281,7 +2347,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2289,131 +2355,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2443,164 +2518,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2641,22 +2718,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2705,24 +2782,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2738,13 +2815,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2798,10 +2875,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2852,42 +2925,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2925,7 +3006,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2940,53 +3021,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2994,6 +3075,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3002,76 +3088,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3104,7 +3192,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3192,6 +3281,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3221,7 +3315,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3234,7 +3328,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3246,29 +3340,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3300,62 +3393,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3406,15 +3521,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3426,39 +3545,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3567,58 +3694,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3651,7 +3803,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3687,35 +3839,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3727,28 +3879,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3757,196 +3913,199 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3974,25 +4133,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4159,20 +4318,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4230,6 +4389,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4245,6 +4405,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4260,6 +4421,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4276,10 +4445,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4336,63 +4501,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4417,11 +4583,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4445,7 +4611,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4460,34 +4626,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4536,6 +4702,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4554,62 +4740,123 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po index 2396075..fbc97b5 100644 --- a/locale/en/LC_MESSAGES/djangojs.po +++ b/locale/en/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-21 17:54-0400\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,14 +18,14 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\resources\common.js:203 +#: resources/common.js:207 msgctxt "time format with day" msgid "%d day %h:%m:%s" msgid_plural "%d days %h:%m:%s" msgstr[0] "" msgstr[1] "" -#: .\resources\common.js:206 +#: resources/common.js:210 msgctxt "time format without day" msgid "%h:%m:%s" msgstr "" diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index cc7c0f6..d03046a 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Spanish\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: es-ES\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "usuario" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "hora de publicación" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "cuerpo del comentario" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Alemán" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Inglés" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Español" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Francés" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Croata" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "Húngaro" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Coreano" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Rumano" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Ruso" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Serbio (Latino)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "Turco" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Vietnamita" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Iniciar sesión" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Inicio" @@ -132,90 +132,92 @@ msgstr "Mostrar comentarios" msgid "Associated page" msgstr "Página asociada" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Concurso incluido" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Problema" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Programación" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Detalles" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Puntuación" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Justicia" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "nombre de usuario" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "virtual" @@ -223,15 +225,15 @@ msgstr "virtual" msgid "link path" msgstr "ruta de enlace" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Contenido" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Resumen" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "Taxanomía" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Puntos" @@ -311,6 +314,7 @@ msgid "User" msgstr "Usuario" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" @@ -344,7 +348,7 @@ 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Descripción" @@ -391,7 +395,7 @@ msgstr "No tienes permiso de revaluar todos esos envíos." 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 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -402,8 +406,8 @@ msgstr[1] "%d de las presentaciones fue rescatado con éxito." msgid "Rescore the selected submissions" msgstr "Repuntear las presentaciones seleccionadas" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Código del problema" @@ -414,8 +418,9 @@ msgstr "Nombre del problema" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Tiempo" @@ -429,7 +434,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Memoria" @@ -480,6 +485,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -492,7 +501,7 @@ msgstr "Subscribirse en las actualizaciones de los concursos" msgid "Enable experimental features" msgstr "Habilitar las actualizaciones experimentales" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, 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." @@ -506,11 +515,13 @@ msgstr "juez" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Nombre de usuario" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Contraseña" @@ -530,7 +541,7 @@ msgstr "Código del problema debe ser ^[a-z0-9]+$" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Identificación del concurso debe ser ^[a-z0-9]+$" @@ -538,12 +549,12 @@ msgstr "Identificación del concurso debe ser ^[a-z0-9]+$" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "N j, Y, g:i a" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -605,7 +616,7 @@ msgstr "comentario" msgid "comments" msgstr "comentarios" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "Editorial de %s" @@ -644,73 +655,103 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Color no válido." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "nombre de la etiqueta" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Sólo letras minúsculas y guiones." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "color de etiqueta" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "descripción de la etiqueta" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "etiqueta del concurso" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "etiquetas del concurso" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "View user participation" +msgid "Hidden for duration of participation" +msgstr "Ver la participación del usuario" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "identificación del concurso" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "nombre del concurso" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Estas personas serán capaces de editar el concurso." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Estas personas serán capaces de editar el concurso." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Estas personas serán capaces de editar el concurso." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "descripción" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "problemas" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "hora de inicio" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "hora final" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "tiempo límite" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "publicidad visible" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -719,78 +760,95 @@ msgstr "" "donde se determina si la publicación es visible para los miembros de las " "organizaciones especificadas." -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "concurso calificado" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Si esta publicación puede ser calificada." -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "ocultar scoreboard" +#: judge/models/contest.py:82 +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "visibilidad pública" -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." +#: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" msgstr "Si el scoreboard debe permanecer oculto durante la competencia." -#: judge/models/contest.py:71 +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "hide scoreboard" +msgid "view contest scoreboard" +msgstr "ocultar scoreboard" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Estas personas serán capaces de editar el concurso." + +#: judge/models/contest.py:88 msgid "no comments" msgstr "sin comentarios" -#: judge/models/contest.py:72 +#: judge/models/contest.py:89 msgid "Use clarification system instead of comments." msgstr "Use el sistema de calificación en vez de comentar." -#: judge/models/contest.py:74 +#: judge/models/contest.py:91 msgid "Rating floor for contest" msgstr "" -#: judge/models/contest.py:76 +#: judge/models/contest.py:93 msgid "Rating ceiling for contest" msgstr "" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "rate all" msgstr "calificar todo" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "Rate all users who joined." msgstr "Calificar todos los usuarios que se unieron." -#: judge/models/contest.py:79 +#: judge/models/contest.py:96 msgid "exclude from ratings" msgstr "excluir de las calificaciones" -#: judge/models/contest.py:81 +#: judge/models/contest.py:98 msgid "private to specific users" msgstr "" -#: judge/models/contest.py:82 +#: judge/models/contest.py:99 msgid "private contestants" msgstr "" -#: judge/models/contest.py:83 +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "ocultar etiquetas de problemas" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 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:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "ejecutar exámenes solamente" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -801,51 +859,52 @@ msgstr "" "desarmado antes de volver a juzgar las presentaciones de los usuarios cuando " "finaliza el concurso." -#: judge/models/contest.py:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "privado para organizaciones" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "organizaciones" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 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:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "Imagen de OpenGraph" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "la cantidad de participantes en vivo" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "resumen del concurso" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 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:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "código de acceso" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." @@ -853,242 +912,256 @@ 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "persona no grata" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "puntos de prueba" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "Ver publicaciones privadas" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "Editar sus propias notas" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "Editar todas las publicaciones" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "Calificar publicaciones" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "Código de acceso a las publicaciones" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "problemas del concurso" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "concurso" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "concursos" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "concurso asociado" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "puntuación" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "tiempo acumulado" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "identificación de la participación virtual" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 #, fuzzy #| msgid "0 means non-virtual, otherwise the n-th virtual participation" 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:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "%s ver en %s" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s en %s, v%d" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s en %s" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "participación del concurso" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "participaciones del concurso" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "problema" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "puntos" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "parcial" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "está protegido" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "orden" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "pruebas de presentación" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 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:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "¿Por qué incluir un problema que no puede enviarse?" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "problema de concurso" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "problemas del concurso" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "envío" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "participación" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "Si esta presentación funcionó sólo en pruebas previas." -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "presentación del concurso" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "presentaciones de concurso" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "rango" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "puntuación" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "volatilidad" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "último calificado" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "calificación del concurso" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "calificaciones del concurso" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1128,7 +1201,7 @@ msgstr "elementos paternales" msgid "post title" msgstr "título de la publicación" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "autores" @@ -1136,7 +1209,7 @@ msgstr "autores" msgid "slug" msgstr "babosa" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "visibilidad pública" @@ -1160,15 +1233,21 @@ msgstr "resumen del post" msgid "openGraph image" msgstr "imagen de openGraph" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "Es privado, sólo estas organizaciones deben ser el concurso" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "Editar todas las publicaciones" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "post del blog" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "posts del blog" @@ -1330,7 +1409,7 @@ 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 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "límite de memoria" @@ -1407,188 +1486,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "idioma" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "nombre traducido" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "descripción traducida" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "problemas de traducción" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "problemas de traducciones" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "problema calificado" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "calificación del cuerpo" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "marca de tiempo de aclaración" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "límite de recursos específicos del idioma" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "límites de recursos específicos del idioma" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "problema asociado" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "fecha de publicación" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "contenido editorial" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "solución" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "soluciones" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "Estándar" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "Flotantes" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "Flotantes (absoluto)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "Flotante (relativo)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "Espacios sin seguimiento" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "Sin ordenar" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "Byte idéntico" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "archivos de datos de zip" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "generador de archivos" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "longitud del prefijo de salida" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "longitud de límite de salida" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "generación de recomendaciones init.yml" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "verificador" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "argumentos del verificador" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "argumentos del verificador como un objetivo JSON" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "problemas de conjunto de datos" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "posición del caso" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "tipo de caso" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "Caso normal" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "Lote de inicio" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "Lote final" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "nombre de archivo de entrada" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "nombre del archivo de salida" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "generador de argumentos" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "valor del punto" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "¿Se trata de una prueba previa?" @@ -1663,7 +1742,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "onganización" @@ -1759,31 +1838,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "perfil del usuario" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "perfiles de usuarios" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "tiempo requerido" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "estado" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "razón" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "solicitud para asociarse a la organización" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "peticiones para unirse a la organización" @@ -1894,88 +1973,88 @@ 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:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "idiomas" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "idioma al que pertenece este tiempo de ejecución" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "juzgar donde exista el runtime" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "nombre de tiempo de ejecución" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "versión de tiempo de ejecución" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "orden en el que se muestra este tiempo de ejecución" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "Nombre del servidor, nombre del host-style" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "fecha de creación" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "Una llave para validar este juez" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "llave de autentificación" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "estatus del juez en línea" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "hola de inicio del juzgado" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "tiempo de respuesta" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "carga del sistema" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 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:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "jueces" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "juez" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "Aceptado" @@ -2004,7 +2083,7 @@ 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:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "Error de compilación" @@ -2199,12 +2278,24 @@ msgstr "publicación" msgid "message time" msgstr "hora del mensaje" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "Página [page] de [topage]" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "Página %d de publicaciones" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Recalcular puntajes" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2216,62 +2307,62 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "No está permitido contraseñas vacías." -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 #, fuzzy #| msgid "How did you corrupt the generator path?" msgid "How did you corrupt the custom checker path?" msgstr "¿Cómo corrompió la ruta del generador?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, 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:123 +#: judge/utils/problem_data.py:125 #, 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:126 +#: judge/utils/problem_data.py:128 #, 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:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "El caso de inicio de lote #%d requiere puntos." -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "¿Cómo usted corrompió la ruta postal?" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "¿Cómo corrompió la ruta del generador?" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" "No se pueden pasar los filtros de consulta y conjunto de palabras clave" @@ -2315,8 +2406,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "Sobre" @@ -2324,7 +2415,7 @@ msgstr "Sobre" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "Página %d de publicaciones" @@ -2341,7 +2432,7 @@ msgstr "" msgid "You already voted." msgstr "Tu ya votaste." -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "Editado desde sitio" @@ -2349,132 +2440,142 @@ msgstr "Editado desde sitio" msgid "Editing comment" msgstr "Comentario editado" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "No hay tal concurso" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, 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:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "Concursos" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "No se pudo encontrar dicho concurso." -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "Acceso al concurso \"%s\" denegado" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "Concurso no permanente" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" no esta actualmente en curso." -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "Ya en el concurso" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Ya estas en el concurso: \"%s\"." -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "Ingrese el código de acceso para \"%s\"" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "Tu no estas concursando \"%s\"." -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "Concursos en %(month)s" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "Estadística" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "%s Clasificaciones" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "Su participación en %s" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "participación de %s en %s" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "En Vivo" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "Participación" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "Concurso etiqueta: %s" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "Descripción del problema" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "calificación del cuerpo" + #: judge/views/error.py:14 msgid "404 error" msgstr "404 error" @@ -2504,66 +2605,67 @@ msgstr "Duración" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "Ninguna organización" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "No se encontró una organización con la clave \"%s\"." -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "Organizaciones" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s miembros" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "Unirse a la organización" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "Ya estas en esta organización." -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "Esta organización no está abierta." -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "Abandonar organización" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "No estás en \"%s\"." -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "Solicitar para unirse %s" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "Únete a detalle de la solicitud" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "Gestionar solicitudes de unirse para %s" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2572,79 +2674,80 @@ msgstr "" "Su organización solo puede recibir %d miembros más. No puede aprobar %d " "usuarios." -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, 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 +#: judge/views/organization.py:298 #, 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 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "Editando %s" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "No se puede editar la organización" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "No tiene permitido editar esta organización." -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 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 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "No se puede reaccionar en contra del usuario" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 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 +#: judge/views/organization.py:371 #, 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:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "No existe ese problema" -#: judge/views/problem.py:70 +#: 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:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "Editorial de{0}" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "Editorial de {0}" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Problemas" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "Esta prohibido enviarlo" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." @@ -2652,20 +2755,20 @@ msgstr "" "Usted ha sido declarado persona no grata por este problema. Usted está " "permanentemente impedido en presentar este problema." -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "Muchos envíos" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 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:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "Enviar a %(problem)s" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2706,22 +2809,22 @@ msgstr "Editando datos para %s" msgid "Generated init.yml for %s" msgstr "Generado init.yml para %s" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2774,7 +2877,7 @@ msgstr "Idioma preferido" msgid "Subscribe to newsletter?" msgstr "¿suscribete en el boletín de noticias?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2783,7 +2886,7 @@ msgstr "" "La dirección de email \"%s\" ya ha sido tomada. Sólo un registro es " "permitido por dirección." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -2791,11 +2894,11 @@ msgstr "" "Su proveedor de correo electrónico no esta permitido debido a el historial " "de abuso. Por favor utilice un proveedor de correo con buena reputación." -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Registro de usuarios" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "Error de autenticación" @@ -2811,13 +2914,13 @@ msgstr "Estado" msgid "Version matrix" msgstr "Versión matriz" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "Presentación de %(problem)s por %(user)s" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "Todos los envíos" @@ -2874,10 +2977,6 @@ msgstr "" msgid "Ticket title" msgstr "Título del ticket" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "Descripción del problema" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2929,42 +3028,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "No existe este usuario" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "Ningún usuario se encarga de \"%s\"." -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "Mi cuenta" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "Usuario %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "M j, Y, G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "Actualizado en el sitio" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "Modificar perfil" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "Tabla de calificación" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -3002,7 +3111,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "Ver presentaciones" @@ -3017,53 +3126,53 @@ msgstr "Editar usuario" msgid "Rejudge" msgstr "Juzgar de nuevo" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "Hola, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Cerrar Sesión" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Iniciar sesión" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "o" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "modo de espectador" -#: templates/base.html:283 +#: templates/base.html:284 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/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Editar" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3074,6 +3183,11 @@ msgstr "" " publicada en %(time)s\n" " " +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "publicado en {time}" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3085,81 +3199,83 @@ msgstr "" " en %(time)s\n" " " -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "Blog" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "Eventos" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "Noticias" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "publicado en {time}" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "Aclaraciones" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "No se han hecho aclaraciones en este momento." -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Concursos en marcha" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Próximos concursos" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "Mis tickets abiertos" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "Tickets nuevos" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "Problemas nuevos" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Corriente del comentario" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Juez en línea" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "Administrador" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Usuarios" +#| msgid "Delete?" +msgid "Delete" +msgstr "¿Eliminar?" #: templates/comments/list.html:2 msgid "Comments" @@ -3191,7 +3307,8 @@ msgstr "Enlace" msgid "Reply" msgstr "Responder" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "Ocultar" @@ -3281,6 +3398,11 @@ msgstr "Viernes" msgid "Saturday" msgstr "Sábado" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Crear" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3310,7 +3432,7 @@ msgstr "Lista" msgid "Calendar" msgstr "Calendario" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "Información" @@ -3323,7 +3445,7 @@ msgstr "Estadística" msgid "Rankings" msgstr "Valoraciones" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "Rankings ocultos" @@ -3335,29 +3457,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "Abandonar concurso" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "Unión virtual" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "Parar de ver" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "Ver concurso" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "Unirse al concurso" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "Inicio de sesión para participar" @@ -3391,15 +3512,21 @@ msgstr "%(length)s larga a partir de %(start_time)s" msgid "AC Rate" msgstr "Tasa de AC" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Usuarios" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "Editorial" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 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 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." @@ -3407,48 +3534,68 @@ msgstr "" "Al unirse a un concurso por primera vez inicia el cronómetro, después se " "vuelve imparable." -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "Organizaciones" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "Espectador" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Unir" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "Búsqueda de problemas..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Concurso" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Concursos en curso" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Próximos eventos" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "No hay concursos programados en este momento." -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Concursos pasados" @@ -3504,15 +3651,21 @@ 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:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organización" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "nombre completo" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3528,47 +3681,59 @@ msgstr "¿Usted esta seguro de que quiere unirse?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "¿Usted esta seguro de que quiere unirse?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "Ver la participación del usuario" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "Mostrar organizaciones" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "nombre completo" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 #, fuzzy #| msgid "Show my tickets only" msgid "Show friends only" msgstr "Sólo mostrar mis tickets" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "identificación de la participación virtual" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "problemas de traducción" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Nombre del problema" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "problemas de traducción" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "Envíos por Lenguaje" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "Tasa de AC por Lenguaje" @@ -3696,58 +3861,97 @@ msgstr "activar" msgid "Update" msgstr "Actualizar" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "Unirse a esta organización" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "Solicitar membresía" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "Organizaciones" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "No hay concursos programados en este momento." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Concurso" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "Editar organización" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "Ver solicitud" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "Administrador de la organización" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "Ver miembros" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "Abandonar organización" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "See private contests" +msgid "New private contests" +msgstr "Ver publicaciones privadas" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "Ver en PDF" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "Problemas nuevos" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "Show organizations" +msgid "Show my organizations only" +msgstr "Mostrar organizaciones" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "Nombre" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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:" @@ -3780,7 +3984,7 @@ msgid "There are no requests to approve." msgstr "No hay solicitudes para aprobar." #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "¿Eliminar?" @@ -3816,37 +4020,37 @@ msgstr "Expulsar" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Información" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "Ver YAML" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "Tipo" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "Archivo de entrada" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "Archivo de salida" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "Pretest?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "Añadir nueva etiqueta" @@ -3862,28 +4066,34 @@ msgstr "" "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 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "Filtrar por tipo..." -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "Problemas calientes" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "Categoría" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "Tipos" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "AC%%" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Clarifications" +msgid "Add clarifications" +msgstr "Aclaraciones" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3892,178 +4102,177 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "Filtrar envíos" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "ubicación" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "Muchos envíos" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "Repuntear las presentaciones seleccionadas" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to join?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "¿Usted esta seguro de que quiere unirse?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "Ver en PDF" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "Enviar solución" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, 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 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "0 envíos restantes" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "Mis Envíos" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "Mejores envíos" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "Muchos envíos" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "Leer editorial" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "Administrar tickets" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "Editar el problema" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "Editar casos de prueba" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "Clonar problema" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "Puntos:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(parcial)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "Tiempo límite:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "Límite de memoria:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "Autor:" msgstr[1] "Autores:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "Tipo de problema" msgstr[1] "Tipos de problema" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "Idiomas permitidos" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "No hay jueces online para %(lang)s" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judge" msgid "Judge:" @@ -4071,23 +4280,28 @@ msgid_plural "Judges:" msgstr[0] "Juez" msgstr[1] "Juez" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "Solicitar aclaración" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "Reportar un problema" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4117,25 +4331,25 @@ msgstr "Mostrar tipos de problemas" msgid "Show editorial" msgstr "Leer editorial" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "Todo" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "Tipos de problema" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "Ir" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "Aleatorio" @@ -4320,20 +4534,20 @@ msgstr "Idioma predeterminado" msgid "Affiliated organizations" msgstr "Organizaciones afiliadas" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "Notificarme sobre próximas competencias" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "Al registrarte, estás aceptando nuestras" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "Términos y condiciones" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "¡Registrarse!" @@ -4391,6 +4605,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "Cargar" @@ -4406,6 +4621,7 @@ 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 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "Identificación" @@ -4421,6 +4637,14 @@ msgstr "Jueces" msgid "Version Matrix" msgstr "Versión matriz" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "A ocurrido un error interno durante la clasificación." @@ -4437,10 +4661,6 @@ msgstr "Filtrar por estatus..." msgid "Filter by language..." msgstr "Filtrar por idioma..." -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "Filtrar envíos" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4498,81 +4718,82 @@ msgstr "Resultados de la ejecución de prueba previa" 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 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "Puntos:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Tiempo:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Memoria" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "Grupo " + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "Caso" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "Antes de la prueba" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Caso de prueba" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Puntos" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "Caso" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "Antes de la prueba" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Caso de prueba" + +#: templates/submission/status-testcases.html:141 #, fuzzy #| msgid "Input file" msgid "Input:" msgstr "Archivo de entrada" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 #, fuzzy #| msgid "Output file" msgid "Output:" msgstr "Archivo de salida" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "Respuesta incorrecta" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 #, fuzzy #| msgid "judging feedback" msgid "Judge feedback:" msgstr "respuesta del juzgado" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 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:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "¡Presentación abortada!" @@ -4597,11 +4818,11 @@ msgstr "El Mejor" msgid "%(user)s's" msgstr "De %(user)s" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "Reabierto: " -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "Cerrado: " @@ -4625,7 +4846,7 @@ msgstr "Asignado" msgid "Title" msgstr "Título" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "Asignados" @@ -4643,34 +4864,34 @@ msgstr "" "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:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "Publicar" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "Objeto asociado" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "Ninguno asignado." -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "Ticket de cierre" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "Reabrir ticket" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "Notas de asignado" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "Nada aquí." -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "Publicar" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "Puesto" @@ -4719,6 +4940,28 @@ msgstr "Script de usuario" msgid "Update profile" msgstr "Actualizar perfil" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "perfil del usuario" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4740,31 +4983,7 @@ msgstr "%(pp).1fpp" msgid "%(pp).0fpp" msgstr "%(pp).0fpp" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "De" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "No has compartido ninguna información." - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "Este usuario no ha compartido ninguna información." - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" msgid "%(counter)s problem solved" @@ -4772,31 +4991,154 @@ msgid_plural "%(counter)s problems solved" msgstr[0] "problemas del concurso" msgstr[1] "problemas del concurso" -#: templates/user/user-base.html:50 -msgid "Rank by points:" -msgstr "Calificar por puntos:" - -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "Puntos totales:" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by rating:" +msgid "Rank by rating" msgstr "Rango de la clasificación:" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "Puntuación:" +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "Calificar por puntos:" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:64 +msgid "From" +msgstr "De" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "No has compartido ninguna información." + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "Este usuario no ha compartido ninguna información." + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s en %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Lunes" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Martes" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Jueves" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Viernes" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "Estado" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Domingo" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Historia" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "Todos los envíos" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "prueba de presentación" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "" +#| "\n" +#| " You have %(left)s submission left\n" +#| " " +#| msgid_plural "" +#| "\n" +#| " You have %(left)s submissions left\n" +#| " " +msgid "Contests written" +msgstr "" +"\n" +" Aún tienes %(left)s envío restante\n" +" " + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "Valatilidad:" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "Calificación mínima:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "Calificación máxima:" @@ -4854,6 +5196,27 @@ msgstr "Perfil del administrador" msgid "Check all" msgstr "Seleccionar todo" +#, fuzzy +#~| msgid "%(counter)s submission left" +#~| msgid_plural "%(counter)s submissions left" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "%(counter)s envío restante" +#~ msgstr[1] "%(counter)s envíos restantes" + +#~ msgid "Rating:" +#~ msgstr "Puntuación:" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "Administrador" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "Repuntear las presentaciones seleccionadas" + #, fuzzy #~| msgid "%(points)s / %(total)s" #~ msgid "Point %(point)s / Case #%(case)s" diff --git a/locale/es/LC_MESSAGES/djangojs.po b/locale/es/LC_MESSAGES/djangojs.po index 1dd72ac..57005ea 100644 --- a/locale/es/LC_MESSAGES/djangojs.po +++ b/locale/es/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Spanish\n" @@ -27,4 +27,3 @@ msgstr[1] "%d días %h:%m:%s" 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 index 89cea88..a1dd7f8 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: French\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: fr\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "utilisateur" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Allemand" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Anglais" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Espagnol" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Français" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Croate" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "Hongrois" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Coréen" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Roumain" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Russe" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Serbe (Latin)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "Turque" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Vietnamien" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Chinois simplifié" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Se connecter" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Accueil" @@ -132,90 +132,92 @@ msgstr "Montrer les commentaires" msgid "Associated page" msgstr "Page associée" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Concours inclus" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Problème" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Planification" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Détails" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Valeur" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Justice" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "nom d'utilisateur" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "virtuel" @@ -223,15 +225,15 @@ msgstr "virtuel" msgid "link path" msgstr "chemin du lien" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Contenu" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Résumé" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "Taxonomie" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Points " @@ -311,6 +314,7 @@ msgid "User" msgstr "Utilisateur" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Courriel" @@ -343,7 +347,7 @@ msgstr "Problèmes non autorisés" 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Description" @@ -390,7 +394,7 @@ msgstr "Vous n'avez pas le droit de resoumettre AUTANT de soumissions." msgid "Rejudge the selected submissions" msgstr "Resoumettre les soumissions sélectionnées" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Code de la problème" @@ -413,8 +417,9 @@ msgstr "Nom de la problème" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Temps" @@ -428,7 +433,7 @@ msgstr "%d Ko" msgid "%.2f MB" msgstr "%.2f Mo" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "RAM" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -501,11 +510,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Nom d'utilisateur" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Mot de passe " @@ -525,7 +536,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -533,12 +544,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -600,7 +611,7 @@ msgstr "commentaire" msgid "comments" msgstr "commentaires" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -637,431 +648,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Couleur invalide." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Des lettres minuscules et des traits d’Union seulement." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "nom du concours" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "problèmes" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "heure de début" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "heure de fin" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "limite de Temps" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "visible publiquement" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "organisations" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "concours" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "concours" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "score" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "problème" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "points" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "partiel" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "soumission" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "évaluation" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1101,7 +1154,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "auteurs" @@ -1109,7 +1162,7 @@ msgstr "auteurs" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1133,15 +1186,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1301,7 +1358,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "limite de mémoire" @@ -1374,188 +1431,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "langue" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "limite de ressources spécifiques à un language" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "limites de ressources spécifiques à un language" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "solution" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "solutions" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1628,7 +1685,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "organisation" @@ -1724,31 +1781,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "profil utilisateur" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "raison" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1839,86 +1896,86 @@ msgstr "" 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:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "langues" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "moment de création" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "Accepté" @@ -1947,7 +2004,7 @@ 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:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "Erreur de compilation" @@ -2142,12 +2199,23 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Recalculer les scores" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2159,60 +2227,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2255,8 +2323,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "A propos" @@ -2264,7 +2332,7 @@ msgstr "A propos" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2281,7 +2349,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2289,131 +2357,141 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "Concours" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "Best solutions for %s" +msgid "New clarification for %s" +msgstr "Les meilleures solutions pour %s" + #: judge/views/error.py:14 msgid "404 error" msgstr "Erreur 404" @@ -2443,164 +2521,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Problèmes" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2641,22 +2721,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2705,7 +2785,7 @@ msgstr "Langue préférée" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2714,17 +2794,17 @@ msgstr "" "Il y a déjà un compte avec cette adresse: \"%s\". Qu’une seule compte est " "autorisée par adresse." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2740,13 +2820,13 @@ msgstr "Etat" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2800,10 +2880,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2854,42 +2930,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "Modifier le profile" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2927,7 +3011,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "Voir les soumissions" @@ -2942,53 +3026,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "Bonjour, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Se déconnecter" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 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/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Modifier" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2996,6 +3080,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "Posted comment" +msgid "posted on {time}" +msgstr "Commentaire posté" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3004,82 +3094,83 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "Blog" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "Evènements" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "Posted comment" -msgid "posted on {time}" -msgstr "Commentaire posté" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Concours en cours" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Concours à venir" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "Nouveaux problèmes" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Flux de commentaire" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Juge en ligne" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "Admin" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Utilisateurs" +#| msgid "Delete?" +msgid "Delete" +msgstr "Supprimer ?" #: templates/comments/list.html:2 msgid "Comments" @@ -3111,7 +3202,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3201,6 +3293,11 @@ msgstr "Vendredi" msgid "Saturday" msgstr "Samedi" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Créer" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3230,7 +3327,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3245,7 +3342,7 @@ msgstr "" msgid "Rankings" msgstr "Classement" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3257,29 +3354,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "Quitter le concours" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "Joindre les concours" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3311,62 +3407,88 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Utilisateurs" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organization" +msgid "Organizations..." +msgstr "Organisation " + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Joindre" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Leave contest" +msgid "Search contests..." +msgstr "Quitter le concours" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Concours" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Concours en cours" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Concours à venir" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 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 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Concours de la passé" @@ -3417,15 +3539,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organisation " -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "nom complet" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3437,43 +3565,51 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "nom complet" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Nom de la problème" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3584,58 +3720,97 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organization" +msgid "Organization news" +msgstr "Organisation " + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "Il n'y a aucun concours au futur à ce moment." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Concours" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "Leave contest" +msgid "New private contests" +msgstr "Quitter le concours" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "Voir en PDF" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "Nouveaux problèmes" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "organizations" +msgid "Show my organizations only" +msgstr "organisations" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3668,7 +3843,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "Supprimer ?" @@ -3704,37 +3879,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Information" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "Genre" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3746,28 +3921,34 @@ msgid "" "problem yourself is a bannable offence.
" msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Best solutions for %s" +msgid "Add clarifications" +msgstr "Les meilleures solutions pour %s" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3776,155 +3957,153 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "View submissions" +msgid "Download selected submissions" +msgstr "Voir les soumissions" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "Voir en PDF" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "View submissions" -msgid "Download AC submissions" -msgstr "Voir les soumissions" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "Points :" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 #, fuzzy #| msgid "Authors" msgid "Author:" @@ -3932,7 +4111,7 @@ msgid_plural "Authors:" msgstr[0] "Auteurs" msgstr[1] "Auteurs" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "problem type" msgid "Problem type" @@ -3940,38 +4119,43 @@ msgid_plural "Problem types" msgstr[0] "type de problème" msgstr[1] "type de problème" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "Languages autorisés" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3999,25 +4183,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4184,20 +4368,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4255,6 +4439,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "Charge" @@ -4270,6 +4455,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4285,6 +4471,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4301,10 +4495,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4361,73 +4551,74 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "Points :" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Temps:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "RAM" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Cas de test" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Points " -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Cas de test" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "Mauvaise réponse" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "Soumission abandonnée !" @@ -4452,11 +4643,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4480,7 +4671,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4495,34 +4686,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "Il n'y a rien ici." -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "Classement" @@ -4571,6 +4762,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "profil utilisateur" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4589,31 +4802,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "Hide problems I've solved" msgid "%(counter)s problem solved" @@ -4621,31 +4810,142 @@ msgid_plural "%(counter)s problems solved" msgstr[0] "Cacher les problèmes que j'ai déjà résolus" msgstr[1] "Cacher les problèmes que j'ai déjà résolus" -#: templates/user/user-base.html:50 -msgid "Rank by points:" -msgstr "Classement par points :" - -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "Total des points :" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by rating" +msgstr "Classement par points :" + +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "Classement par points :" + +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "Classement :" +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Lundi" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Mardi" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Jeudi" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Vendredi" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "Etat" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Dimanche" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Histoire" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "submissions" +msgid "total submission(s)" +msgstr "soumissions" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission" +msgid "submissions in the last year" +msgstr "soumission" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "Contests" +msgid "Contests written" +msgstr "Concours" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" @@ -4703,6 +5003,14 @@ msgstr "Profil d'Admin" msgid "Check all" msgstr "Cocher tout" +#~ msgid "Rating:" +#~ msgstr "Classement :" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "Admin" + #~ msgid "Your output (clipped)" #~ msgstr "Votre retour (abrégé)" diff --git a/locale/fr/LC_MESSAGES/djangojs.po b/locale/fr/LC_MESSAGES/djangojs.po index c41af44..697e5ac 100644 --- a/locale/fr/LC_MESSAGES/djangojs.po +++ b/locale/fr/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: French\n" @@ -27,4 +27,3 @@ msgstr[1] "%d jours %h:%m:%s" 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 index a7c5bd2..c55f0a3 100644 --- a/locale/hr/LC_MESSAGES/django.po +++ b/locale/hr/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Croatian\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: hr\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "korisnik" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "vrijeme objave" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "tekst komentara" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Njemački" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Engleski" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Španjolski" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Francuski" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Hrvatski" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "Mađarski" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Korejski" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Rumunjski" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Ruski" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Srpski (Latinica)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "Turski" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Vijetnamski" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Pojednostavljeni kineski" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Prijava" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Početna" @@ -135,46 +135,48 @@ msgstr "Otkrij komentare" msgid "Associated page" msgstr "Povezana stranica" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Uključena natjecanja" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Zadatak" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Raspoređivanje" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Pojedinosti" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Bodovi" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Pravda" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -182,11 +184,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -194,11 +196,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -206,7 +208,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -214,15 +216,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "korisničko ime" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "virtualno" @@ -230,15 +232,15 @@ msgstr "virtualno" msgid "link path" msgstr "putanja veze" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Sadržaj" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Sažetak" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -260,8 +262,9 @@ msgid "Taxonomy" msgstr "Taksonomija" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Bodovi" @@ -320,6 +323,7 @@ msgid "User" msgstr "Korisnik" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "E-mail" @@ -353,7 +357,7 @@ msgstr "Nedozvoljeni zadaci" 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Opis" @@ -400,7 +404,7 @@ msgstr "Nemate dozvolu za ponovnu evaluaciju toliko puno predanih rješenja." msgid "Rejudge the selected submissions" msgstr "Reevaluiraj označena predana rješenja" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -412,8 +416,8 @@ msgstr[2] "%d predanih rješenja je uspješno ponovno ocijenjeno." msgid "Rescore the selected submissions" msgstr "Ponovno ocijeni označena predana rješenja" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Kod zadatka" @@ -424,8 +428,9 @@ msgstr "Ime zadatka" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Vrijeme" @@ -439,7 +444,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Memorija" @@ -488,6 +493,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -500,7 +509,7 @@ msgstr "Pretplati se na novosti na natjecanju" msgid "Enable experimental features" msgstr "Uključi eksperimentalne opcije" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, 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." @@ -512,11 +521,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Korisničko ime" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Lozinka" @@ -536,7 +547,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "ID natjecanja mora biti ^[a-z0-9]+$" @@ -544,12 +555,12 @@ msgstr "ID natjecanja mora biti ^[a-z0-9]+$" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "N j, Y, g:i a" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -611,7 +622,7 @@ msgstr "komentar" msgid "comments" msgstr "komentari" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "Objašnjenje za %s" @@ -648,431 +659,487 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Pogrešna boja." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "naziv oznake" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Samo mala slova i crtice." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "boja oznake" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "opis oznake" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "oznaka natjecanja" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "oznake natjecanja" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "ID natjecanja" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "naziv natjecanja" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Ove osobe će moći uređivati natjecanje." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Ove osobe će moći uređivati natjecanje." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Ove osobe će moći uređivati natjecanje." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "opis" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "zadaci" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "vrijeme početka" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "vrijeme kraja" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "vremensko ograničenje" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "javno vidljivo" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "bodovanje natjecanja" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Može li ovo natjecanje biti bodovano." -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -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:71 -msgid "no comments" -msgstr "bez komentara" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "Koristite sustav za pojašnjenja umjesto komentara." - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "boduj sve" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "Boduj sve korisnike koji su se pridružili." - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "izostavi iz bodovanja" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" +msgstr "Treba li tablica poretka ostati skrivena za vrijeme natjecanja." + +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "contest rated" +msgid "view contest scoreboard" +msgstr "bodovanje natjecanja" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Ove osobe će moći uređivati natjecanje." + +#: judge/models/contest.py:88 +msgid "no comments" +msgstr "bez komentara" + +#: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "Koristite sustav za pojašnjenja umjesto komentara." + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "boduj sve" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "Boduj sve korisnike koji su se pridružili." + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "izostavi iz bodovanja" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "sakrij oznake zadataka" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "Trebaju li oznake zadataka biti zadano skrivene." -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "pokreni samo predtestiranje" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "privatno za organizacije" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph slika" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "persona non grata" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "natjecanje" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "natjecanja" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "bodovi" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1112,7 +1179,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1120,7 +1187,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1144,15 +1211,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1312,7 +1383,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "memorijsko ograničenje" @@ -1387,188 +1458,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1641,7 +1712,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1737,31 +1808,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1852,86 +1923,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1960,7 +2031,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2153,12 +2224,23 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Ponovno izračunavanje rezultata" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2170,60 +2252,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2269,8 +2351,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2278,7 +2360,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2295,7 +2377,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2303,131 +2385,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "404 greška" @@ -2457,73 +2548,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "Zahtjev za pridruživanje %s" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2531,7 +2623,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2539,84 +2631,85 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "Uređivanje %s" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "Nije moguće urediti organizaciju" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "Nemate ovlasti za uređivanje ove organizacije." -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 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 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "Nije moguće izbaciti korisnika" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "Korisnik kojeg pokušavate izbaciti ne postoji!" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, 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:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Zadaci" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "Previše poslanih rješenja" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2657,22 +2750,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2722,7 +2815,7 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "Pretplatite se na naš newsletter?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2731,17 +2824,17 @@ msgstr "" "Vaša adresa e-pošte \"%s\" je već zauzeta. Dopuštena je isključivo jedna " "registracija za jednu adresu e-pošte." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Registracija" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2757,13 +2850,13 @@ msgstr "Status predanog rješenja" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, 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:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "Sva predana rješenja" @@ -2817,10 +2910,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2871,42 +2960,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2944,7 +3041,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2959,53 +3056,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3013,6 +3110,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "posted time" +msgid "posted on {time}" +msgstr "vrijeme objave" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3021,79 +3124,80 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "posted time" -msgid "posted on {time}" -msgstr "vrijeme objave" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Evaluator" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3127,7 +3231,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3217,6 +3322,11 @@ msgstr "Petak" msgid "Saturday" msgstr "Subota" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3246,7 +3356,7 @@ msgstr "" msgid "Calendar" msgstr "Kalendar" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3259,7 +3369,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3271,29 +3381,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3327,62 +3436,88 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organization" +msgid "Organizations..." +msgstr "Organizacija" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "contests" +msgid "Search contests..." +msgstr "natjecanja" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3433,15 +3568,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organizacija" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3453,41 +3592,49 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Ime zadatka" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3598,58 +3745,91 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organization" +msgid "Organization news" +msgstr "Organizacija" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "rate all" +msgid "View all" +msgstr "boduj sve" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "Disallowed problems" +msgid "New private problems" +msgstr "Nedozvoljeni zadaci" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "private to organizations" +msgid "Show my organizations only" +msgstr "privatno za organizacije" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3682,7 +3862,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3718,37 +3898,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Informacije" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3760,28 +3940,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3790,87 +3974,90 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "Previše poslanih rješenja" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "Ponovno ocijeni označena predana rješenja" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3878,69 +4065,63 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "Previše poslanih rješenja" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 #, fuzzy #| msgid "Authors" msgid "Author:" @@ -3949,7 +4130,7 @@ msgstr[0] "Autori" msgstr[1] "Autori" msgstr[2] "Autori" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "Problem code" msgid "Problem type" @@ -3958,39 +4139,44 @@ msgstr[0] "Kod zadatka" msgstr[1] "Kod zadatka" msgstr[2] "Kod zadatka" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4018,25 +4204,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4204,20 +4390,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4275,6 +4461,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4290,6 +4477,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4305,6 +4493,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4321,10 +4517,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4381,71 +4573,72 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points" msgid "Point: " msgstr "Bodovi" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time" msgid "Time: " msgstr "Vrijeme" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Memorija" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Bodovi" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4470,11 +4663,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4498,7 +4691,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4513,34 +4706,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4589,6 +4782,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "User" +msgid "User File" +msgstr "Korisnik" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4607,31 +4822,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4639,31 +4830,140 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "allows partial points" +msgid "Total points" +msgstr "dopušteno djelomično bodovanje" + +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rating" +msgid "Rank by rating" +msgstr "Bodovi" + +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:90 +msgid "You have not shared any information." msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s u %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Ponedjeljak" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Utorak" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Četvrtak" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Petak" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "Status" +msgid "Sat" +msgstr "Status predanog rješenja" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Nedjelja" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Povijest" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "Sva predana rješenja" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "contest rated" +msgid "Contests written" +msgstr "bodovanje natjecanja" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" @@ -4722,3 +5022,16 @@ msgstr "" #: templates/widgets/select_all.html:8 msgid "Check all" msgstr "" + +#, fuzzy +#~| msgid "All submissions for %s" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "Sva predana rješenja za korisnika %s" +#~ msgstr[1] "Sva predana rješenja za korisnika %s" +#~ msgstr[2] "Sva predana rješenja za korisnika %s" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "Ponovno ocijeni označena predana rješenja" diff --git a/locale/hr/LC_MESSAGES/djangojs.po b/locale/hr/LC_MESSAGES/djangojs.po index ef0d238..5f9bde4 100644 --- a/locale/hr/LC_MESSAGES/djangojs.po +++ b/locale/hr/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Croatian\n" @@ -10,7 +10,8 @@ msgstr "" "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" +"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" @@ -28,4 +29,3 @@ msgstr[2] "%d dana %h:%m:%s" 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 index 13611d5..0707642 100644 --- a/locale/hu/LC_MESSAGES/django.po +++ b/locale/hu/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Hungarian\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: hu\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "felhasználó" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "hozzászólás ideje" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "hozzászólás törzse" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Német" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Angol" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Spanyol" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Francia" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Horvát" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Koreai" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Román" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Orosz" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Szerb (latin)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Vietnami" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Egyszerűsített kínai" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Belépés" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Nyitólap" @@ -132,90 +132,92 @@ msgstr "Kommentek megjelenítése" msgid "Associated page" msgstr "Kapcsolódó lap" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Hozzárendelt versenyek" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Feladat" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Időbeosztás" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Részletek" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Értékelés" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Igazságszolgáltatás" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "felhasználónév" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "virtuális" @@ -223,15 +225,15 @@ msgstr "virtuális" msgid "link path" msgstr "csatolási útvonal" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Tartalom" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Összefoglalás" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "Rendszerezés" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Pontok" @@ -311,6 +314,7 @@ msgid "User" msgstr "Felhasználó" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" @@ -343,7 +347,7 @@ msgstr "Tiltott feladatok" 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Leírás" @@ -390,7 +394,7 @@ msgstr "Nincs jogosultságod ilyen sok feltöltés újratesztelésére." 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 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "%d feltöltés sikeresen újrapontozva." msgid "Rescore the selected submissions" msgstr "A kiválasztott feltöltések újrapontozása" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Feladat azonosító" @@ -413,8 +417,9 @@ msgstr "Feladat név" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Idő" @@ -428,7 +433,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Memória" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "Iratkozz fel hírlevelünkre" msgid "Enable experimental features" msgstr "Kísérleti funkciók engedélyezése" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, 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." @@ -503,11 +512,13 @@ msgstr "bíró" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Felhasználóinév" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Jelszó" @@ -527,7 +538,7 @@ msgstr "A feladat azonosítónak ^[a-z0-9]+$ kell lennie" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "A verseny azonosítójának ^[a-z0-9]+$ kell lennie" @@ -535,12 +546,12 @@ msgstr "A verseny azonosítójának ^[a-z0-9]+$ kell lennie" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "N j, Y, g:i a" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -602,7 +613,7 @@ msgstr "hozzászólás" msgid "comments" msgstr "hozzászólások" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "Megoldási útmutató %s-hez" @@ -641,73 +652,103 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Érvénytelen szín." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "címke neve" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Csak kisbetűk és kötőjelek." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "címke színe" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "címke leírása" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "verseny címkéje" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "verseny cimkéi" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "virtual participation id" +msgid "Hidden for duration of participation" +msgstr "virtuális részvételi azonosító" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "verseny azonosítója" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "verseny neve" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Ezek az emberek szerkeszthetik a versenyt." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Ezek az emberek szerkeszthetik a versenyt." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Ezek az emberek szerkeszthetik a versenyt." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "leírás" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "feladatok" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "kezdés" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "befejezés" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "időkorlát" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "nyilvánosan látható" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -716,363 +757,391 @@ msgstr "" "látható-e. Célszerű meghatározni még szervezeten belüli-privát versenyeken " "is." -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "értékelt verseny" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Hogy ez a verseny értékelhető-e." -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "nincsenek hozzászólások" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "A pontosítási rendszer használata hozzászólások helyett." - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "összes értékelése" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "Értékelése az összes felhasználónak, aki csatlakozott." - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "kizárás a értékelésből" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" -msgstr "" +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "láthatóság" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 +#, fuzzy +#| msgid "contest rated" +msgid "view contest scoreboard" +msgstr "értékelt verseny" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Ezek az emberek szerkeszthetik a versenyt." + +#: judge/models/contest.py:88 +msgid "no comments" +msgstr "nincsenek hozzászólások" + +#: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "A pontosítási rendszer használata hozzászólások helyett." + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "összes értékelése" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "Értékelése az összes felhasználónak, aki csatlakozott." + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "kizárás a értékelésből" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "feladat címkék elrejtése" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "csak pretesztek futtatása" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "privát a csoport számára" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "csoportok" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 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:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph kép" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "az éles résztvevők száma" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "verseny összefoglaló" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "hozzáférési kód" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "nemkívánatos személy" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "teszteset pontjai" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "Privát versenyek mutatása" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "Saját versenyek szerkesztése" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "Az összes verseny szerkesztése" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "Versenyek értékelése" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "Verseny hozzáférési kódok" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "versenyfeladatok" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "verseny" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "versenyek" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "pontszám" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "összes idő" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "virtuális részvételi azonosító" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 #, fuzzy #| msgid "0 means non-virtual, otherwise the n-th virtual participation" 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:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "%s megfigyel %s-ben" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s en %s, v%d" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s %s-ben" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "verseny részvétel" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "verseny részvételek" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "feladat" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "pontok" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "részleges" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "pretesztes-e" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "sorrend" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 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:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "versenyfeladat" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "versenyfeladatok" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "feltöltés" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "részvétel" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "verseny feltöltés" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "verseny feltöltések" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "helyezés" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "értékelés" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "volatilitás" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "utolsó értékelt" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "verseny értékelés" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "verseny értékelések" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1112,7 +1181,7 @@ msgstr "szülő elem" msgid "post title" msgstr "bejegyzés címe" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "szerzők" @@ -1120,7 +1189,7 @@ msgstr "szerzők" msgid "slug" msgstr "csonk" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "láthatóság" @@ -1144,15 +1213,21 @@ msgstr "tartalom összefoglalója" msgid "openGraph image" msgstr "openGraph kép" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "Ha privát, csak ezek a csoportok láthatják a versenyt" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "Összes poszt szerkesztése" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "blog poszt" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "blog posztok" @@ -1314,7 +1389,7 @@ 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 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "memória korlát" @@ -1387,188 +1462,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "nyelv" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "lefordított név" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "lefordított leírás" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "feladat fordítás" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "feladat fordítások" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "pontosított feladat" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "pontosítás törzse" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "pontosítás időbélyege" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "nyelv specifikus erőforrás korlát" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "nyelv specifikus erőforrás korlátok" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "hozzárendelt probléma" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "publikálás dátuma" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "megoldási útmutató tartalom" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "megoldás" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "megoldások" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "Alapértelmezett" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "Lebegőpontosak" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "Lebegőpontosak (abszolút)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "Lebegőpontosak (relatív)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "Rendezetlen" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "Bájtonként azonos" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "adat zip fájl" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "generátor fájl" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "kimeneti prefix hossza" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "kimenet hossz limitje" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "init.yml generálás visszajelzése" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "checker" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "checker argumentumai" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "chceker argumentumai JSON objektumként" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "feladat adathalmaz" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "eset hely" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "eset típus" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "Normál eset" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "Batch kezdete" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "Batch vége" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "bemeneti fájl név" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "kimeneti fájl név" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "generátor argumentumai" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "pont érték" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "ez az eset preteszt?" @@ -1643,7 +1718,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "csoport" @@ -1739,31 +1814,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "felhasználói profil" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "felhasználói profilok" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "kérési idő" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "állapot" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "ok" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "csoport belépési kérelem" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "csoport belépési kérelmek" @@ -1854,88 +1929,88 @@ msgstr "kiterjesztés" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "nyelvek" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "runtime név" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "runtime verzió" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "Szerver név, hosztnév-szerűen" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "létrehozás dátuma" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "A tesztelőhöz hozzárendelt kulcs" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "hitelesítő kulcs" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "tesztelő státusza" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "tesztelő indítási ideje" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "válaszidő" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "rendszer terheltsége" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "bírók" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "bíró" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "Elfogadva" @@ -1964,7 +2039,7 @@ 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:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "Fordítási hiba" @@ -2159,12 +2234,23 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Pontok újraszámítása" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2176,60 +2262,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, 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:126 +#: judge/utils/problem_data.py:128 #, 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:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2272,8 +2358,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2281,7 +2367,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2298,7 +2384,7 @@ msgstr "" msgid "You already voted." msgstr "Már szavaztál." -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "Szerkesztve az oldalról" @@ -2306,132 +2392,142 @@ msgstr "Szerkesztve az oldalról" msgid "Editing comment" msgstr "Hozzászólás szerkesztése" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "Nincs ilyen verseny" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "Nem található verseny a \"%s\" kulccsal." -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "Versenyek" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "Nem található ilyen verseny." -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "Hozzáférés a \"%s\" versenyhez megtagadva" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "A verseny nincs folyamatban" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" nincs folyamatban." -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "Már a versenyben vagy" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Már a \"%s\" versenyben vagy." -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, 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:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "Nem vagy a \"%s\" versenyben." -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Submission Statistics" msgid "%s Statistics" msgstr "Beküldési statisztikák" -#: judge/views/contests.py:601 -msgid "???" -msgstr "???" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "Probléma leírása" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "pontosítás törzse" + #: judge/views/error.py:14 msgid "404 error" msgstr "404-es hiba" @@ -2461,66 +2557,67 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "Nincs ilyen csoport" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "Nem található csoport a \"%s\" kulccsal." -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "Csoportok" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s Tagok" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "Belépés a csoportba" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "Már benne vagy a csoportba." -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "Ez a csoport nem nyílt." -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "Csoport elhagyása" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "Nem vagy \"%s\"-ben." -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "Kérés a \"%s\"-hez való csatlakozásra" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "Belépési kérés részletei" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "%s belépési kéréseinek kezelése" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2529,79 +2626,80 @@ msgstr "" "A csoportod csak %d további tagot tud fogadni. Nem tudsz felvenni %d " "felhasználót." -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, 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 +#: judge/views/organization.py:298 #, 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 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "%s szerkesztése" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "Nem lehet szerkeszteni a csoportot" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "Nincs jogosultságod szerkeszteni ezt a csoportot." -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 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 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "Nem lehet kirúgni a felhasználót" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 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 +#: judge/views/organization.py:371 #, 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:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "Nincs ilyen feladat" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "Megoldás útmutató {0}-hez" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "Megoldási útmutató {0}-hez" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Feladatok" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "Feltöltéstől eltiltott" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." @@ -2609,20 +2707,20 @@ 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:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "Túl sok feltöltés" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2663,22 +2761,22 @@ msgstr "" 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 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2727,7 +2825,7 @@ msgstr "Preferált nyelv" msgid "Subscribe to newsletter?" msgstr "Feliratkozol a hírlevélre?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2736,17 +2834,17 @@ msgstr "" "A \"%s\" email cím már foglalt. Csak egy regisztráció engedélyezett " "címenként." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Regisztráció" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "Azonosítási hiba" @@ -2762,13 +2860,13 @@ msgstr "Státusz" msgid "Version matrix" msgstr "Verzió mátrix" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "Összes beküldés" @@ -2822,10 +2920,6 @@ msgstr "" msgid "Ticket title" msgstr "Hibajegy cím" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "Probléma leírása" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2877,42 +2971,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "Nincs ilyen felhasználó" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "Saját fiók" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "Felhasználó %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "M j, Y, G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "Frissítve az oldalon" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "Profil szerkesztése" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "Ranglista" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2950,7 +3054,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2965,53 +3069,53 @@ msgstr "Felhasználó szerkesztése" msgid "Rejudge" msgstr "Újratesztel" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "Heló, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Kilépés" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "vagy" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "megfigyelés" -#: templates/base.html:283 +#: templates/base.html:284 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/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Szerkesztés" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3019,6 +3123,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time}-kor posztolva" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3027,81 +3136,83 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "Blog" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "Események" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "Hírek" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "{time}-kor posztolva" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "Pontosítások" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "Nem jelentek meg pontosítások még." -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Folyamatban lévő versenyek" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Közelgő versenyek" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "Nyitott hibajegyeim" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "Új hibajegy" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "Új feladatok" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Kommentfolyam" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Online tesztelő" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "Admin" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Felhasználók" +#| msgid "Delete?" +msgid "Delete" +msgstr "Törlés?" #: templates/comments/list.html:2 msgid "Comments" @@ -3135,7 +3246,8 @@ msgstr "Link" msgid "Reply" msgstr "Válasz" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "Elrejtés" @@ -3225,6 +3337,11 @@ msgstr "Péntek" msgid "Saturday" msgstr "Szombat" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Létrehozás" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3254,7 +3371,7 @@ msgstr "Lista" msgid "Calendar" msgstr "Naptár" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3267,7 +3384,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3279,29 +3396,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "Virtuális csatlakozás" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "Felhagyás a megfigyeléssel" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3333,62 +3449,88 @@ msgstr "" msgid "AC Rate" msgstr "AC arány" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Felhasználók" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "Megoldási útmutató" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "Biztos hogy csatlakozni akarsz?" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "Csoportok" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "Megfigyelés" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Csatlakozás" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "Feladatok keresése..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Verseny" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Folyamatban lévő versenyek" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Közelgő Versenyek" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "Jelenleg nincs ütemezett verseny." -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Elmúlt Versenyek" @@ -3439,15 +3581,21 @@ msgstr "" 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:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Intézmény" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "teljes név" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3463,47 +3611,59 @@ msgstr "Biztos hogy csatlakozni akarsz?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "Biztos hogy csatlakozni akarsz?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "Csoportok mutatása" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "teljes név" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 #, fuzzy #| msgid "Show my tickets only" msgid "Show friends only" msgstr "Csak a saját hibajegyek mutatása" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "virtuális részvételi azonosító" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "feladat fordítás" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Feladat név" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "feladat fordítás" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "Beküldések nyelvenként" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3622,58 +3782,97 @@ msgstr "aktiválás" msgid "Update" msgstr "Frissít" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "Belépés a csoportba" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "Tagság kérelmezése" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "Csoportok" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "Jelenleg nincs ütemezett verseny." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Verseny" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "Csoport szerkesztése" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "Kérések megtekintése" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "Csoport adminisztrációja" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "Tagok megtekintése" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "Csoport elhagyása" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "See private contests" +msgid "New private contests" +msgstr "Privát versenyek mutatása" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "Mutasd PDF-ként" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "Új feladatok" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "Show organizations" +msgid "Show my organizations only" +msgstr "Csoportok mutatása" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "Név" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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ó:" @@ -3706,7 +3905,7 @@ 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:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "Törlés?" @@ -3742,37 +3941,37 @@ msgstr "Kirúg" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Információ" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "Típus" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "Bementi fájl" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "Kimeneti fájl" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "Preteszt?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "Új eset hozzáadása" @@ -3789,28 +3988,34 @@ msgstr "" "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 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "Szűrés típus szerint..." -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "Kategória" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "Típusok" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "AC %%" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Clarifications" +msgid "Add clarifications" +msgstr "Pontosítások" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3819,178 +4024,177 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "helyszín" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "Túl sok feltöltés" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "A kiválasztott feltöltések újrapontozása" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to join?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "Biztos hogy csatlakozni akarsz?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "Mutasd PDF-ként" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "Megoldás beküldése" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, 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 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "0 beküldés van hátra" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "Beküldéseim" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "Legjobb beküldések" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "Túl sok feltöltés" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "Megoldási útmutató olvasása" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "Hibajegyek kezelése" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "Feladat szerkesztése" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "Teszt adatok szerkesztése" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "Feladat klónozása" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "Pontok:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(részleges)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "Időkorlát:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "Memóriakorlát:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "Szerző:" msgstr[1] "Szerzők:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "Feladat típus" msgstr[1] "Feladat típusok" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "Engedélyezett nyelvek" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "Nincs jelenleg online %(lang)s tesztelő" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judge" msgid "Judge:" @@ -3998,23 +4202,28 @@ msgid_plural "Judges:" msgstr[0] "Tesztelő" msgstr[1] "Tesztelő" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "Pontosítást kérek" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "Hiba jelentése" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4044,25 +4253,25 @@ msgstr "" msgid "Show editorial" msgstr "Megoldási útmutató olvasása" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4229,20 +4438,20 @@ msgstr "Alapértelmezett nyelv" msgid "Affiliated organizations" msgstr "Kapcsolódó csoportok" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "Felhasználási feltételek" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4300,6 +4509,7 @@ msgid "Ping" msgstr "Ping" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4315,6 +4525,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "Azonosító" @@ -4334,6 +4545,14 @@ msgstr "Tesztelő" msgid "Version Matrix" msgstr "Verzió mátrix" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4350,10 +4569,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4410,79 +4625,80 @@ msgstr "Pretesztek futtatásának eredményei" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "Pontok:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Idő:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Memória" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "Eset" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "Preteszt" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Teszt eset" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Pontok" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "Eset" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "Preteszt" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Teszt eset" + +#: templates/submission/status-testcases.html:141 #, fuzzy #| msgid "Input file" msgid "Input:" msgstr "Bementi fájl" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 #, fuzzy #| msgid "Output file" msgid "Output:" msgstr "Kimeneti fájl" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "Rossz válasz" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 #, fuzzy #| msgid "judging feedback" msgid "Judge feedback:" msgstr "tesztelési visszajelzés" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4507,11 +4723,11 @@ msgstr "Legjobb" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "Újranyitva: " -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "Lezárva: " @@ -4535,7 +4751,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4550,34 +4766,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4626,6 +4842,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "felhasználói profil" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4644,31 +4882,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" msgid "%(counter)s problem solved" @@ -4676,31 +4890,144 @@ msgid_plural "%(counter)s problems solved" msgstr[0] "versenyfeladatok" msgstr[1] "versenyfeladatok" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "allows partial points" +msgid "Total points" +msgstr "részleges pontok engedélyezése" + +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "rating" +msgid "Rank by rating" +msgstr "értékelés" + +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "points" +msgid "Rank by points" +msgstr "pontok" + +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:90 +msgid "You have not shared any information." msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s - %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Hétfő" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Kedd" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Csütörtök" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Péntek" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "Állapot" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Vasárnap" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Előzmények" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "Összes beküldés" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "0 submissions left" +msgid "submissions in the last year" +msgstr "0 beküldés van hátra" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "contest rated" +msgid "Contests written" +msgstr "értékelt verseny" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" @@ -4764,6 +5091,24 @@ msgstr "Profil szerkesztése" msgid "Check all" msgstr "Az összes kijelölése" +#, fuzzy +#~| msgid "%(counter)s submission left" +#~| msgid_plural "%(counter)s submissions left" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "%(counter)s beküldés van hátra" +#~ msgstr[1] "%(counter)s beküldés van hátra" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "Admin" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "A kiválasztott feltöltések újrapontozása" + #~ msgid "Output limit" #~ msgstr "Kimenet limit" diff --git a/locale/hu/LC_MESSAGES/djangojs.po b/locale/hu/LC_MESSAGES/djangojs.po index 83fa1a0..24f1796 100644 --- a/locale/hu/LC_MESSAGES/djangojs.po +++ b/locale/hu/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Hungarian\n" @@ -27,4 +27,3 @@ msgstr[1] "%d nap %h:%m:%s" 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 index e667b03..cd68ad8 100644 --- a/locale/it/LC_MESSAGES/django.po +++ b/locale/it/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Italian\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: it\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -132,90 +132,92 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -223,15 +225,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -311,6 +314,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -343,7 +347,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -390,7 +394,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -413,8 +417,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -428,7 +433,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -501,11 +510,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -525,7 +536,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -533,12 +544,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -600,7 +611,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -637,431 +648,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1101,7 +1154,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1109,7 +1162,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1133,15 +1186,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1301,7 +1358,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1374,188 +1431,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1628,7 +1685,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1724,31 +1781,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1839,86 +1896,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1947,7 +2004,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2140,12 +2197,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2157,60 +2223,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2253,8 +2319,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2262,7 +2328,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2279,7 +2345,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2287,131 +2353,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2441,164 +2516,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2639,22 +2716,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2703,24 +2780,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2736,13 +2813,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2796,10 +2873,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2850,42 +2923,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2923,7 +3004,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2938,53 +3019,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2992,6 +3073,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3000,76 +3086,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3102,7 +3190,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3190,6 +3279,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3219,7 +3313,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3232,7 +3326,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3244,29 +3338,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3298,62 +3391,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3404,15 +3519,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3424,39 +3543,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3565,58 +3692,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3649,7 +3801,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3685,35 +3837,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3725,28 +3877,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3755,196 +3911,199 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3972,25 +4131,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4157,20 +4316,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4228,6 +4387,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4243,6 +4403,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4258,6 +4419,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4274,10 +4443,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4334,63 +4499,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4415,11 +4581,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4443,7 +4609,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4458,34 +4624,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4534,6 +4700,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4552,62 +4738,123 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/it/LC_MESSAGES/djangojs.po b/locale/it/LC_MESSAGES/djangojs.po index 958375c..ef56d5b 100644 --- a/locale/it/LC_MESSAGES/djangojs.po +++ b/locale/it/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Italian\n" @@ -27,4 +27,3 @@ msgstr[1] "" 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 index 4345f8f..5d14a95 100644 --- a/locale/ja/LC_MESSAGES/django.po +++ b/locale/ja/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Japanese\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: ja\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "利用者" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "投稿時刻" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "コメント本文" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "ドイツ語" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "英語" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "スペイン語" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "フランス語" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "クロアチア語" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "ハンガリー語" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "日本語" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "韓国語" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "ルーマニア語" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "ロシア語" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "セルビア語(ラテン)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "トルコ語" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "ベトナム語" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "簡体字中国語" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "ログイン" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "ホーム" @@ -130,86 +130,88 @@ msgstr "コメントの非表示を解除する" msgid "Associated page" msgstr "関連するページ" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "含まれているコンテスト" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "課題" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "設定" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "スケジュール" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "詳細" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "フォーマット" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "評価" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "アクセス" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "正義" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." msgstr[0] "%d 個の課題を公開しました。" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "課題を公開する" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." msgstr[0] "%d 個の課題を非公開としました。" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "課題を非公開にする" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "%d 人の参加者を再計算。" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "再計算の結果" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "利用者名" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "仮想" @@ -217,15 +219,15 @@ msgstr "仮想" msgid "link path" msgstr "リンクパス" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "内容" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "概要" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -247,8 +249,9 @@ msgid "Taxonomy" msgstr "分類" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "点数" @@ -303,6 +306,7 @@ msgid "User" msgstr "利用者" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "電子メール" @@ -334,7 +338,7 @@ msgstr "許可されていない課題" msgid "These problems are NOT allowed to be submitted in this language" msgstr "それらの課題は、この言語での提出は許可されていません" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "説明" @@ -381,7 +385,7 @@ msgstr "あなたには、それら多くの提出物を再判定する権限が msgid "Rejudge the selected submissions" msgstr "選択された提出物を再判定する" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -391,8 +395,8 @@ msgstr[0] "%d 個の提出物が正常に再採点されました。" msgid "Rescore the selected submissions" msgstr "選択した提出物を再採点する" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "課題のコード" @@ -403,8 +407,9 @@ msgstr "課題名" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "時間" @@ -418,7 +423,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "メモリ" @@ -467,6 +472,10 @@ msgstr "既定値" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -479,7 +488,7 @@ msgstr "コンテストの更新を購読する" msgid "Enable experimental features" msgstr "実験的な機能を有効化する" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "あなたは {count} 個以上の公開組織に参加できない場合があります。" @@ -493,11 +502,13 @@ msgstr "判定器" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "利用者名" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "パスワード" @@ -517,7 +528,7 @@ msgstr "課題のコードは ^[a-z0-9]+$ でなければなりません" msgid "Problem with code already exists." msgstr "このコードを使用している問題はすでに存在しています。" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "コンテスト id は ^[a-z0-9]+$ でなければなりません" @@ -525,12 +536,12 @@ msgstr "コンテスト id は ^[a-z0-9]+$ でなければなりません" msgid "Contest with key already exists." msgstr "同じキーを持つコンテストはすでに存在しています。" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "N j, Y, g:i a" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -592,7 +603,7 @@ msgstr "コメント" msgid "comments" msgstr "コメント" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "%s の論説" @@ -631,73 +642,103 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "不正な色。" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "タグ名" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "小文字とハイフンのみです。" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "タグの色" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "タグの説明" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "コンテストのタグ" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "コンテストのタグ" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "View user participation" +msgid "Hidden for duration of participation" +msgstr "利用者の参加を見る" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "コンテスト id" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "コンテスト名" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "これらの人々 は、コンテストを編集することができます。" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "これらの人々 は、コンテストを編集することができます。" + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "これらの人々 は、コンテストを編集することができます。" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "説明" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "課題" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "開始時刻" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "終了時刻" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "時間制限" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "公開されています" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -705,77 +746,94 @@ msgstr "" "コンテストが指定された組織のメンバーに表示されるかどうかを決定するものであ" "り、組織にプライベートなコンテストには設定すべきです。" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "評価されているコンテスト" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "このコンテストを評価できるようにするか。" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "得点表を非表示にする" +#: judge/models/contest.py:82 +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "一般公開" -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." +#: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" msgstr "コンテスト中に得点表を非表示にしておくべきかどうか" -#: judge/models/contest.py:71 +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "hide scoreboard" +msgid "view contest scoreboard" +msgstr "得点表を非表示にする" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "これらの人々 は、コンテストを編集することができます。" + +#: judge/models/contest.py:88 msgid "no comments" msgstr "コメントがありません" -#: judge/models/contest.py:72 +#: judge/models/contest.py:89 msgid "Use clarification system instead of comments." msgstr "コメントではなく解説システムを使う。" -#: judge/models/contest.py:74 +#: judge/models/contest.py:91 msgid "Rating floor for contest" msgstr "" -#: judge/models/contest.py:76 +#: judge/models/contest.py:93 msgid "Rating ceiling for contest" msgstr "" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "rate all" msgstr "全てを評価する" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "Rate all users who joined." msgstr "参加している全ての利用者を評価する。" -#: judge/models/contest.py:79 +#: judge/models/contest.py:96 msgid "exclude from ratings" msgstr "評価から除外する" -#: judge/models/contest.py:81 +#: judge/models/contest.py:98 msgid "private to specific users" msgstr "" -#: judge/models/contest.py:82 +#: judge/models/contest.py:99 msgid "private contestants" msgstr "プライベートな参加者" -#: judge/models/contest.py:83 +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" "もしプライベートであれば、その参加者のみがコンテストを見ることができます。" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "課題のタグを非表示にする" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "課題タグをデフォルトで非表示にするかどうか" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "予備テストのみ実行する" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -785,49 +843,50 @@ msgstr "" "コンテスト中に設定し、コンテストが終了して利用者の提出物を再判定する前に解除" "する。" -#: judge/models/contest.py:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "組織へプライベートにする" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "組織" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "もしプライベートであれば、組織の者だけがコンテストを見ることができます" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph 画像" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "ライブ参加者の人数" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "コンテスト概要" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "ソーシャルメディアなどのメタ説明タグに表示されるプレーンテキスト。" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "アクセスコード" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." @@ -835,241 +894,257 @@ msgstr "" "コンテストへの参加が許可される前に競技者に提示するオプションのコード。無効に" "するには空白のままにします。" -#: judge/models/contest.py:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "感謝しない人" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "選択した利用者の、このコンテストへの参加を禁止する。" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "テストケースの点数" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "プライベートのコンテストを見る" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "自分のコンテストを編集する" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "全てのコンテストを編集する" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "コンテストを評価する" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "コンテストのアクセス コード" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "プライベートなコンテストの生成" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +#, fuzzy +#| msgid "Mark contests as visible" +msgid "Change contest visibility" +msgstr "課題を公開する" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "コンテストの課題" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "コンテスト" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "コンテスト" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "関連するコンテスト" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "得点" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "累積時間" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "仮想参加 id" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 #, fuzzy #| msgid "0 means non-virtual, otherwise the n-th virtual participation" msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "0 は仮想参加者がおらず、そうでなければn人の仮想参加者がいます" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "%s は %s を観戦している" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s は %s 中で v%d として参加" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s は %s に参加" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "コンテスト参加者" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "コンテスト参加者" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "課題" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "点数" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "部分点" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "予備テストされているか" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "順番" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "提出テストケース" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "この課題への提出物の最大数、制限なしの場合は 0 。" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "なぜあなたが提出できない課題を含むのか?" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "コンテストの課題" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "コンテストの課題" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "提出" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "参加者" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "この提出物が予備テストだけを実行したのかどうか。" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "コンテスト提出" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "コンテスト提出" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "順位" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "評価" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "変動率" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "最後の評価" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "コンテストの評価" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "コンテストの評価" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1109,7 +1184,7 @@ msgstr "親項目" msgid "post title" msgstr "投稿の題目" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "著者" @@ -1117,7 +1192,7 @@ msgstr "著者" msgid "slug" msgstr "スラグ" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "一般公開" @@ -1141,15 +1216,21 @@ msgstr "投稿の概要" msgid "openGraph image" msgstr "openGraph 画像" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "もしプライベートであれば、組織の者だけがコンテストを見ることができます" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "すべての投稿を編集する" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "ブログ投稿" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "ブログ投稿" @@ -1310,7 +1391,7 @@ msgid "" msgstr "" "この課題の秒単位での制限時間。小数秒(例えば1.5)はサポートされています。" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "メモリ制限" @@ -1384,188 +1465,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "言語" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "翻訳された名前" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "翻訳された説明" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "翻訳された課題" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "翻訳された課題" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "解説された課題" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "解説本文" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "解説のタイムスタンプ" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "言語固有のリソース制限" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "言語固有のリソース制限" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "関連する課題" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "発行日" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "編集内容" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "解答" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "解答" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "標準" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "実数" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "実数(絶対値)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "実数(相対値)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "非末尾スペース" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "順不同" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "バイト一致" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "データの zip ファイル" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "ジェネレータファイル" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "出力プレフィクス長" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "出力制限長" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "init.yml 生成のフィードバック" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "チェッカー" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "チェッカー引数" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "JSON オブジェクトとしてのチェッカー引数" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "課題データセット" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "ケースの位置" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "ケースのタイプ" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "標準のケース" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "バッチ開始" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "バッチ終了" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "入力ファイル名" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "出力ファイル名" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "ジェネレーターの引数" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "点数" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "予備テストのケースか?" @@ -1638,7 +1719,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "組織" @@ -1734,31 +1815,31 @@ msgstr "内部メモ" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "ユーザープロフィール" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "ユーザープロフィール" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "要求時刻" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "状態" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "理由" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "組織への参加要求" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "組織への参加要求" @@ -1861,88 +1942,88 @@ msgstr "拡張子" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "ソースファイルの拡張子、例えば \"py\" や \"cpp\"。" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "言語" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "このランタイムが属する言語" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "このランタイムが存在する判定器" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "ランタイム名" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "ランタイムのバージョン" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "このランタイムを表示する順序" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "サーバー名、ホスト名形式" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "作成日" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "この判定器を認証する鍵" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "認証鍵" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "判定器のオンライン状態" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "判定器の開始時刻" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "応答時間" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "システム負荷" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "最近1分の負荷、公平のためプロセッサ数で割ってある。" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "判定器" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "判定器" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "合格した" @@ -1971,7 +2052,7 @@ msgid "Runtime Error" msgstr "ランタイムエラー" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "コンパイル エラー" @@ -2166,12 +2247,24 @@ msgstr "投稿者" msgid "message time" msgstr "メッセージの時刻" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "ページ [page] / [topage]" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "投稿のページ %d" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "得点を再計算する" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2183,62 +2276,62 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "空のバッチは、許可されていません。" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 #, fuzzy #| msgid "How did you corrupt the generator path?" msgid "How did you corrupt the custom checker path?" msgstr "どのようにあなたがジェネレータのパスを破損したか?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "非バッチケース #%d のために点数が定義されなければなりません。" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "ケース %d の入力ファイルが存在しません: %s" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "ケース %d の出力ファイルが存在しません: %s" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "ケース #%d のバッチ開始には点数が必要です。" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "ケース #%d の外でバッチの終了を試みる。" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "どのようにあなたが zip パスを破損したか?" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "どのようにあなたがジェネレータのパスを破損したか?" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "問合せセットと絞り込みキーワードの両方は渡せません。" @@ -2278,8 +2371,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "サイトについて" @@ -2287,7 +2380,7 @@ msgstr "サイトについて" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "投稿のページ %d" @@ -2304,7 +2397,7 @@ msgstr "" msgid "You already voted." msgstr "あなたは既に投票しました。" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "サイトから編集された" @@ -2312,132 +2405,142 @@ msgstr "サイトから編集された" msgid "Editing comment" msgstr "コメントの編集" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "そのようなコンテストはありません" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "鍵 \"%s\" を持つコンテストは見つかりませんでした。" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "コンテスト" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "このようなコンテストは見つかりませんでした。" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "コンテスト \"%s\" へのアクセスは拒否されました" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "開催中ではないコンテスト" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" は現在開催中ではありません。" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "既にコンテストに参加しています" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "あなたは既にコンテストに参加しています: \"%s\"。" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "\"%s\" のアクセスコードを入力してください" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "あなたはコンテストに参加していません: \"%s\"。" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "%(month)s 年のコンテスト" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "統計" -#: judge/views/contests.py:601 -msgid "???" -msgstr "???" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "%s 順位表" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "あなたの %s への参加" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "%s の %s への参加" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "ライブ" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "参加" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "コンテストタグ: %s" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "問題の説明" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "解説本文" + #: judge/views/error.py:14 msgid "404 error" msgstr "404エラー" @@ -2467,66 +2570,67 @@ msgstr "ランタイム" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "このような組織はありません" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "鍵 \"%s\" を持つ組織は見つかりませんでした。" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "組織" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s のメンバー" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "所属している組織" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "あなたは、既にこの組織にしょぞくしています。" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "この組織は公開ではありません。" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "組織から脱退する" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "あなたは \"%s\" に所属していません。" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "%s への参加を申し込む" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "参加申込みの詳細" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "%s への参加申込みを管理する" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2535,77 +2639,78 @@ msgstr "" "あなたの組織はあと %d 人のメンバーしか受け入れられません。あなたは %d 人の利" "用者を承認できません。" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "%d 人の利用者を承認しました。" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "%d 人の利用者を拒否しました。" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "%s を編集" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "組織を編集できません" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "あなたは、この組織を編集することは許可されていません。" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "あなたはこの組織から人を追い出すことを許可されていません。" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "利用者を追い出せません" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "あなたが追い出そうとしている利用者は存在しません!" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "あなたが追い出そうとしているユーザは組織内にいません: %s 。" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "そのような課題はありません" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "コード \"%s\" を有する課題は見つかりませんでした。" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "{0} の論説" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "{0} の論説" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "課題" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "提出が禁止された" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." @@ -2613,20 +2718,20 @@ msgstr "" "あなたはこの課題に感謝しない人として宣言されている。あなたはこの課題に提出す" "ることを永続的に禁止されている。" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "提出物が多過ぎます" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "あなたは、この課題の提出制限を超えました" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "%(problem)s に提出する" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2667,22 +2772,22 @@ msgstr "%s のデータの編集" msgid "Generated init.yml for %s" msgstr "%s への生成された init.yml" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2730,7 +2835,7 @@ msgstr "好みの言語" msgid "Subscribe to newsletter?" msgstr "ニュースレターを購読しますか?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2739,7 +2844,7 @@ msgstr "" "電子メールアドレス \"%s\" は既に使用されています。1アドレスにつき1登録だけが" "許されています。" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -2747,11 +2852,11 @@ msgstr "" "あなたの電子メールプロバイダは不正利用の履歴のため許可されていません。信頼で" "きる電子メールプロバイダを利用してください。" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "登録" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "認証の失敗" @@ -2767,13 +2872,13 @@ msgstr "状態" msgid "Version matrix" msgstr "バージョンマトリックス" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "%(user)s による %(problem)s への提出物" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "全ての提出物" @@ -2831,10 +2936,6 @@ msgstr "" msgid "Ticket title" msgstr "チケットの題目" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "問題の説明" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2886,42 +2987,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "そのような利用者はいません" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "利用者ハンドル \"%s\" はありません。" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "自分のアカウント" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "利用者 %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "M j, Y, G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "サイトで更新された" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "プロフィールを編集する" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "リーダーボード" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2959,7 +3070,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "提出物を表示する" @@ -2974,53 +3085,53 @@ msgstr "利用者を編集する" msgid "Rejudge" msgstr "再判定" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "こんにちは、%(username)s。" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "ログアウト" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "ログイン" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "または" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "観戦中" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "このサイトはJavaScriptを有効にすると最適に動作します。" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "編集" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3031,6 +3142,11 @@ msgstr "" " %(time)s に投稿された \n" " " +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time} に投稿された" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3042,81 +3158,83 @@ msgstr "" " %(time)s にて \n" " " -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "ブログ" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "イベント" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "お知らせ" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "{time} に投稿された" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "解説" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "現時点では何も解説されていません。" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "開催中のコンテスト" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "近日開催予定のコンテスト" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "私のオープンチケット" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "新しいチケット" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "新しい課題" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "コメントストリーム" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "オンライン判定" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "管理" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "利用者" +#| msgid "Delete?" +msgid "Delete" +msgstr "削除しますか?" #: templates/comments/list.html:2 msgid "Comments" @@ -3148,7 +3266,8 @@ msgstr "リンク" msgid "Reply" msgstr "返信" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "非表示" @@ -3238,6 +3357,11 @@ msgstr "金曜日" msgid "Saturday" msgstr "土曜日" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "作成" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3267,7 +3391,7 @@ msgstr "一覧" msgid "Calendar" msgstr "カレンダー" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "情報" @@ -3280,7 +3404,7 @@ msgstr "統計" msgid "Rankings" msgstr "順位表" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "非表示の順位表" @@ -3292,29 +3416,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "コンテストから脱退する" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "仮想参加" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "観戦を停止する" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "コンテストを観戦する" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "コンテストに参加する" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "参加するためにログインする" @@ -3348,15 +3471,21 @@ msgstr "開始時刻 %(start_time)s まであと %(length)s" msgid "AC Rate" msgstr "受理率" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "利用者" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "論説" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "あなたは本当に参加したいですか?" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." @@ -3364,48 +3493,68 @@ msgstr "" "コンテストに参加するとあなたのタイマーがスタートし、その後は止められなくなり" "ます。" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "組織" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "観戦する" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "参加する" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "問題を検索する..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "コンテスト" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "開催中のコンテスト" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "近日開催予定のコンテスト" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "現在スケジュールされているコンテストはありません。" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "過去のコンテスト" @@ -3459,15 +3608,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "次の組織だけがこのコンテストをアクセスできます:" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "組織" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "氏名" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3483,47 +3638,59 @@ msgstr "あなたは本当に参加したいですか?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "あなたは本当に参加したいですか?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "利用者の参加を見る" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "組織を表示する" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "氏名" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 #, fuzzy #| msgid "Show my tickets only" msgid "Show friends only" msgstr "私のチケットだけを表示する" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "仮想参加 id" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "翻訳された課題" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "課題名" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "翻訳された課題" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "言語ごとの提出物" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "言語の受理割合" @@ -3648,58 +3815,97 @@ msgstr "有効化" msgid "Update" msgstr "更新" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "組織に参加する" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "メンバーシップを要求する" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "組織" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "現在スケジュールされているコンテストはありません。" + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "コンテスト" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "組織を編集する" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "要求を表示する" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "組織を管理する" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "メンバーを表示する" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "組織から脱退する" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "See private contests" +msgid "New private contests" +msgstr "プライベートのコンテストを見る" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "PDF として表示する" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "新しい課題" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "Show organizations" +msgid "Show my organizations only" +msgstr "組織を表示する" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "名前" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "利用者:" @@ -3732,7 +3938,7 @@ msgid "There are no requests to approve." msgstr "承認するための要求がありません。" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "削除しますか?" @@ -3768,37 +3974,37 @@ msgstr "追い出す" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "情報" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "YAML を見る" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "タイプ" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "入力ファイル" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "出力ファイル" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "事前テストか?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "新しいケースを追加する" @@ -3814,28 +4020,34 @@ msgstr "" "意を表してください。

自身で課題を解く前に公式の解答を提出すること" "は禁止されています。" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "タイプで絞り込む..." -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "ホットな課題" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "カテゴリ" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "タイプ" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "受理 %%" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Clarifications" +msgid "Add clarifications" +msgstr "解説" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3844,198 +4056,202 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "提出物を絞り込む" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "位置" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "提出物が多過ぎます" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "選択した提出物を再採点する" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to join?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "あなたは本当に参加したいですか?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "PDF として表示する" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "解答を提出する" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "%(counter)s 個の提出物が残っています" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "提出物が残っていません" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "私の提出物" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "最優秀提出物" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "提出物が多過ぎます" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "論説を読む" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "チケットを管理する" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "課題を編集する" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "テストデータを編集する" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "課題を複製する" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "点数:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(部分点)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "制限時間:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "メモリ制限:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "著者:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "課題のタイプ" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "許可されている言語" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "%(lang)s はオンライン判定されません" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judge" msgid "Judge:" msgid_plural "Judges:" msgstr[0] "判定器" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "解説を要求する" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "問題を報告する" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4065,25 +4281,25 @@ msgstr "課題のタイプを表示する" msgid "Show editorial" msgstr "論説を読む" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "全て" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "課題のタイプ" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "点数の範囲" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "実行する" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "ランダム" @@ -4262,20 +4478,20 @@ msgstr "デフォルトの言語" msgid "Affiliated organizations" msgstr "所属組織" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "まもなく開催予定のコンテストを通知する" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "登録することで、あなたは同意することになります" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "利用規約・条件" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "登録!" @@ -4333,6 +4549,7 @@ msgid "Ping" msgstr "ピン" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "負荷" @@ -4348,6 +4565,7 @@ msgid "There are no judges available at this time." msgstr "現在利用できる判定器はありません。" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "ID" @@ -4363,6 +4581,14 @@ msgstr "判定器" msgid "Version Matrix" msgstr "バージョンマトリックス" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "採点中に内部エラーが発生しました。" @@ -4379,10 +4605,6 @@ msgstr "状態で絞り込む..." msgid "Filter by language..." msgstr "言語で絞り込む..." -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "提出物を絞り込む" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4440,83 +4662,84 @@ msgstr "事前テストの実行結果" msgid "Execution Results" msgstr "実行結果" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "バッチ" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "点数:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "時刻:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "メモリ" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "バッチ" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" -"ケース\n" -"Vaka" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "事前テスト" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "テストケース" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "点数" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" +"ケース\n" +"Vaka" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "事前テスト" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "テストケース" + +#: templates/submission/status-testcases.html:141 #, fuzzy #| msgid "Input file" msgid "Input:" msgstr "入力ファイル" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 #, fuzzy #| msgid "Output file" msgid "Output:" msgstr "出力ファイル" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "間違った解答" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 #, fuzzy #| msgid "judging feedback" msgid "Judge feedback:" msgstr "判定のフィードバック" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" "予備テストに通過したことは、システムテストでの満点を保証するものではありませ" "ん。" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "提出が中断された!" @@ -4541,11 +4764,11 @@ msgstr "最優秀" msgid "%(user)s's" msgstr "%(user)s" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "再オープンしました:" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "閉じられました:" @@ -4569,7 +4792,7 @@ msgstr "担当者" msgid "Title" msgstr "題目" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "担当者" @@ -4587,34 +4810,34 @@ msgstr "" "のではないことを心に留めてください。課題を解くのに援助が必要な場合は、代わり" "にコメントで尋ねて下さい。" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "投稿する" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "関連するオブジェクト" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "誰も割り当てられていません。" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "チケットを閉じる" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "チケットを再度開く" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "担当者メモ" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "何もありません。" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "投稿する" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "ランク" @@ -4663,6 +4886,28 @@ msgstr "利用者スクリプト" msgid "Update profile" msgstr "プロフィールの更新" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "ユーザープロフィール" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4684,62 +4929,161 @@ msgstr "%(pp).1fpp" msgid "%(pp).0fpp" msgstr "%(pp).0fpp" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "差出人" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "あなたは、いかなる情報も共有していません。" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "この利用者は、いかなる情報も共有していません。" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" 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:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "合計点:" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by rating:" +msgid "Rank by rating" msgstr "評価による順位:" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "評価:" +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "点数による順位:" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:64 +msgid "From" +msgstr "差出人" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "あなたは、いかなる情報も共有していません。" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "この利用者は、いかなる情報も共有していません。" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(contest)s 中の %(problem)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "月曜日" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "火曜日" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "木曜日" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "金曜日" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "状態" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "日曜日" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "履歴" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "全ての提出物" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "提出テストケース" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "" +#| "\n" +#| " You have %(left)s submission left\n" +#| " " +#| msgid_plural "" +#| "\n" +#| " You have %(left)s submissions left\n" +#| " " +msgid "Contests written" +msgstr "" +"\n" +" あなたは提出物 %(left)s が残っています \n" +" " + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "変動率:" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "最小の評価:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "最大の評価:" @@ -4797,6 +5141,26 @@ msgstr "管理者プロフィール" msgid "Check all" msgstr "すべてをチェックする" +#, fuzzy +#~| msgid "%(counter)s submission left" +#~| msgid_plural "%(counter)s submissions left" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "%(counter)s 個の提出物が残っています" + +#~ msgid "Rating:" +#~ msgstr "評価:" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "管理" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "選択した提出物を再採点する" + #, fuzzy #~| msgid "%(points)s / %(total)s" #~ msgid "Point %(point)s / Case #%(case)s" diff --git a/locale/ja/LC_MESSAGES/djangojs.po b/locale/ja/LC_MESSAGES/djangojs.po index 236f5d4..4838764 100644 --- a/locale/ja/LC_MESSAGES/djangojs.po +++ b/locale/ja/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Japanese\n" @@ -26,4 +26,3 @@ msgstr[0] "%d 日 %h:%m:%s" 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 index 8f9a141..858e8bd 100644 --- a/locale/ko/LC_MESSAGES/django.po +++ b/locale/ko/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Korean\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: ko\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "사용자" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "게시 시각" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "코멘트 본문" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "독일어" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "영어" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "스페인어" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "프랑스어" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "크로아티아어" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "헝가리어" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "한국어" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "루마니아어" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "러시아어" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "세르비아어(라틴문자)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "터키어" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "베트남어" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "중국어(간체)" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "로그인" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "메인" @@ -130,86 +130,88 @@ msgstr "코멘트 보이기" msgid "Associated page" msgstr "관련 페이지" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "포함된 대회" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "문제" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Scheduling" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "세부사항" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "순위" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "정의" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." msgstr[0] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." msgstr[0] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "사용자 이름" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "가상" @@ -217,15 +219,15 @@ msgstr "가상" msgid "link path" msgstr "링크 경로" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "내용" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "요약" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -247,8 +249,9 @@ msgid "Taxonomy" msgstr "분류" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "포인트" @@ -303,6 +306,7 @@ msgid "User" msgstr "사용자" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "이메일" @@ -334,7 +338,7 @@ msgstr "허가되지 않은 문제" msgid "These problems are NOT allowed to be submitted in this language" msgstr "이 문제는 이 언어로는 제출이 불가합니다." -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "설명" @@ -381,7 +385,7 @@ msgstr "재채점 가능 개수를 초과하였습니다." msgid "Rejudge the selected submissions" msgstr "선택한 제출 재채점" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -391,8 +395,8 @@ msgstr[0] "%d개의 제출이 성공적으로 재채점되었습니다." msgid "Rescore the selected submissions" msgstr "재채점" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "문제 코드" @@ -403,8 +407,9 @@ msgstr "문제 이름" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "시간" @@ -418,7 +423,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Memory" @@ -467,6 +472,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -479,7 +488,7 @@ msgstr "대회 업데이트를 구독하세요." msgid "Enable experimental features" msgstr "베타 기능 활성화" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "{count}개보다 많은 공개 조직에 소속될 수 없습니다." @@ -493,11 +502,13 @@ msgstr "채점" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "사용자 이름" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "비밀번호" @@ -517,7 +528,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Contest id must be ^[a-z0-9]+$" @@ -525,12 +536,12 @@ msgstr "Contest id must be ^[a-z0-9]+$" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -592,7 +603,7 @@ msgstr "코멘트" msgid "comments" msgstr "코멘트" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -629,148 +640,191 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "잘못된 색상" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "태그 이름" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "소문자와 하이픈만 사용가능합니다." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "태그 색상" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "태그 설명" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "대회 태그" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "대회 태그" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "virtual participation id" +msgid "Hidden for duration of participation" +msgstr "가상 참여 id" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "대회 id" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "대회 이름" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "이 사람들은 대회를 편집할 권한이 있습니다." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "이 사람들은 대회를 편집할 권한이 있습니다." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "이 사람들은 대회를 편집할 권한이 있습니다." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "설명" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "문제" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "시작 시각" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "종료 시각" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "시간 제한" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "공개" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "대회 순위" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "대회 순위 표시 여부" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "코멘트 없음" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "코멘트 대신 수정 시스템을 사용하세요." - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "모든 순위" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "참가한 모든 사용자에 대한 순위" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "순위에서 제외" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" -msgstr "" +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "공개 여부" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 +#, fuzzy +#| msgid "contest rated" +msgid "view contest scoreboard" +msgstr "대회 순위" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "이 사람들은 대회를 편집할 권한이 있습니다." + +#: judge/models/contest.py:88 +msgid "no comments" +msgstr "코멘트 없음" + +#: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "코멘트 대신 수정 시스템을 사용하세요." + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "모든 순위" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "참가한 모든 사용자에 대한 순위" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "순위에서 제외" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "문제 태그 숨기기" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "문제 태그 공개 여부 기본값" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "pretests만 실행" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -779,287 +833,302 @@ msgstr "" "judge가 pretests만 채점할지, 모든 테스트 데이터를 채점할지 여부. 일반적으로 " "대회 종료전까지 설정 후 대회 종료 후 해제하여 모든 테스트 케이스 채점 진행" -#: judge/models/contest.py:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "조직에 비공개" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "조직" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "비공개로 설정 시, 이 조직만 대회를 볼 수 있습니다." -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph 이미지" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "현재 접속되어 있는 참가자 수" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "대회 요약" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "액세스 코드" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "테스크 케이스 점수" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "대회 문제" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "대회" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "대회" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "관련된 대회" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "점수" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "누적 시간" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "가상 참여 id" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s에서 %s" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "대회 참가" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "대회 참가자" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "문제" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "점수" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "부분" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "pretested 됨" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "순서" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "제출 테스트 케이스" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "대회 문제" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "대회 문제" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "제출" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "참가 여부" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "Pretests에서만 이 제출이 실행되었는지 여부" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "대회 제출" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "대회 제출" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "등수" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "순위" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "변동" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "최근 순위" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "대회 순위" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "대회 순위" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1099,7 +1168,7 @@ msgstr "부모 항목" msgid "post title" msgstr "게시물 제목" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "저자" @@ -1107,7 +1176,7 @@ msgstr "저자" msgid "slug" msgstr "slug" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "공개 여부" @@ -1131,15 +1200,21 @@ msgstr "게시물 요약" msgid "openGraph image" msgstr "openGraph 이미지" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "비공개로 설정 시, 이 조직만 대회를 볼 수 있습니다." + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "블로그 게시물" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "블로그 게시물" @@ -1299,7 +1374,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "메모리 제한" @@ -1372,188 +1447,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "언어" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "번역된 이름" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "번역된 설명" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "문제 번역" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "문제 번역" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "수정된 문제" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "수정사항" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "수정 타임스탬프" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "특정 언어 리소스 제한" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "특정 언어 리소스 제한" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "관련된 문제" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "솔루션" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "솔루션" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "표준" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "Floats" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "Floats (absolute)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "Floats (relative)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "정렬되지 않은" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "바이트 단위로 동일" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "채점 데이터 파일" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "generator 파일" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "출력 접두사 길이" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "출력 길이 제한" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "init.yml generation 피드백" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "checker" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "checker arguments" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "checker arguments as a JSON object" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "채점 데이터" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "case position" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "데이터 유형" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "일반 테스트 케이스" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "Batch 시작" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "Batch 종료" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "입력 파일 이름" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "출력 파일 이름" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1626,7 +1701,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "조직" @@ -1722,31 +1797,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "사용자 프로파일" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "사용자 프로파일" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "요청 시간" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "상태" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "이유" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "조직 가입 요청" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "조직 가입 요청" @@ -1837,88 +1912,88 @@ msgstr "확장" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "소스 파일 확장자" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "언어" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "이 런타임에 속해 있는 언어" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "judge on which this runtime exists" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "런타임 이름" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "런타임 버전" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "런타임 표시 순서" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "서버 이름" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "생성 날짜" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "A key to authenticated this judge" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "authentication key" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "judge 상태" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "judge 시작 시간" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "응답 시간" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "시스템 로드" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "1분간의 로드율(프로세서 수로 나눔)" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "채점기" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "채점" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "통과" @@ -1947,7 +2022,7 @@ msgid "Runtime Error" msgstr "런타임 에러" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "컴파일 에러" @@ -2142,12 +2217,24 @@ msgstr "포스터" msgid "message time" msgstr "메시지 시간" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "[topage]의 페이지 [page]" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "게시물 %d 페이지" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "점수 재계산" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2159,62 +2246,62 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "빈 batches는 허용되지 않습니다." -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 #, fuzzy #| msgid "How did you corrupt the zip path?" msgid "How did you corrupt the custom checker path?" msgstr "압축 파일 경로를 어떻게 손상하셨나요?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "테스트 케이스 %d에 대한 입력 파일이 존재하지 않습니다.: %s" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "테스트 케이스 %d에 대한 출력 파일이 존재하지 않습니다.: %s" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "압축 파일 경로를 어떻게 손상하셨나요?" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2254,8 +2341,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2263,7 +2350,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "게시물 %d 페이지" @@ -2280,7 +2367,7 @@ msgstr "" msgid "You already voted." msgstr "이미 투표하셨습니다." -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "사이트에서 편집" @@ -2288,132 +2375,142 @@ msgstr "사이트에서 편집" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "그런 대회는 존재하지 않습니다." -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "키 %s로는 대회를 찾을 수 없습니다." -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "대회" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "그런 대회를 찾을 수 있습니다." -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "%s 대회 접근이 거부되었습니다." -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "현재 진행중인 대회가 아닙니다." -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "%s는 현재 진행중이 아닙니다." -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "대회에 이미 있습니다." -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "현재 대회 %s에 이미 참가해 있습니다." -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "현재 대회 %s에 참가중이 아닙니다." -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Language statistics" msgid "%s Statistics" msgstr "언어 통계" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "%s 순위" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "%s에 대한 당신의 참가" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "%s's %s에 대한 참가" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "실시간" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "참여" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "대회 태그: %s" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "수정사항" + #: judge/views/error.py:14 msgid "404 error" msgstr "404 Error!!!" @@ -2443,66 +2540,67 @@ msgstr "런타임" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "존재하지 않는 조직" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "%s 조직을 찾을 수 없습니다." -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "조직" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s 멤버" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "조직 가입" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "이미 조직에 가입되어 있습니다." -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "이 조직은 공개되어 있지 않습니다." -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "조직 탈퇴" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "%s에 있지 않습니다." -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "%s 가입 신청" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "가입 신청 세부 사항" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "%s 가입 신청 가입" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2511,96 +2609,97 @@ msgstr "" "당신의 조직은 %d명의 회원만 더 가입이 가능합니다. %d명의 사용자 가입 승인이 " "불가합니다." -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "%d명 사용자 승인" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "%d명 거부" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "%s 편집중" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "조직 편집이 불가합니다." -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "조직을 편집할 권한이 없습니다." -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "조직 사용자를 탈퇴시킬 권한이 없습니다." -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "이 사용자를 탈퇴시킬 수 없습니다." -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "탈퇴시키려는 사용자가 존재하지 않습니다." -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "존재하지 않는 문제" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "%s 문제를 찾을 수 없습니다." -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "문제" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2641,22 +2740,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2704,7 +2803,7 @@ msgstr "선호하는 언어" msgid "Subscribe to newsletter?" msgstr "뉴스레터에 구독하시겠습니까?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2712,7 +2811,7 @@ msgid "" msgstr "" "이메일 주소 %s는 사용중입니다. 하나의 주소에 대해 한번만 가입이 허용됩니다." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -2720,11 +2819,11 @@ msgstr "" "스팸으로 인해 이 이메일 제공업체는 허용되지 않습니다. 다른 메일 주소를 사용" "해 주세요." -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "회원가입" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "인증 실패" @@ -2740,13 +2839,13 @@ msgstr "현재 상태" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "모든 제출들" @@ -2804,10 +2903,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2858,42 +2953,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2931,7 +3034,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2946,53 +3049,53 @@ msgstr "사용자 수정" msgid "Rejudge" msgstr "재체점" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "로그아웃" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "관전" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "이 사이트는 자바 스크립트를 활성화시켜야 정상적으로 작동합니다." -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3000,6 +3103,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "posted time" +msgid "posted on {time}" +msgstr "게시 시각" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3008,81 +3117,80 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "posted time" -msgid "posted on {time}" -msgstr "게시 시각" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Online Judge" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -#, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "관리자" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3116,7 +3224,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3206,6 +3315,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3237,7 +3351,7 @@ msgstr "" msgid "Calendar" msgstr "표준" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3252,7 +3366,7 @@ msgstr "" msgid "Rankings" msgstr "%s 순위" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 #, fuzzy #| msgid "%s Rankings" msgid "Hidden Rankings" @@ -3266,31 +3380,30 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 #, fuzzy #| msgid "spectating" msgid "Stop spectating" msgstr "관전" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3326,62 +3439,88 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "조직" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "contests" +msgid "Search contests..." +msgstr "대회" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3432,15 +3571,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "그룹" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "전체 이름" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3452,45 +3597,57 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "전체 이름" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "가상 참여 id" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "문제 번역" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "문제 이름" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "문제 번역" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3601,58 +3758,95 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "조직" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contests" +msgid "Controls" +msgstr "대회" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "associated contest" +msgid "New private contests" +msgstr "관련된 대회" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "rate all" +msgid "View all" +msgstr "모든 순위" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "associated problem" +msgid "New private problems" +msgstr "관련된 문제" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "organizations" +msgid "Show my organizations only" +msgstr "조직" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3685,7 +3879,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3721,37 +3915,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "정보" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3763,28 +3957,34 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "clarification body" +msgid "Add clarifications" +msgstr "수정사항" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3793,202 +3993,206 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "위치" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "All submissions" +msgid "Download selected submissions" +msgstr "모든 제출들" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "재채점" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, fuzzy, python-format #| msgid "contest submission" msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "대회 제출" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "All submissions" -msgid "Download AC submissions" -msgstr "모든 제출들" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 #, fuzzy #| msgid "Authors" msgid "Author:" msgid_plural "Authors:" msgstr[0] "저자" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "problem type" msgid "Problem type" msgid_plural "Problem types" msgstr[0] "문제 유형" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "judge" msgid "Judge:" msgid_plural "Judges:" msgstr[0] "채점" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4016,25 +4220,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4200,20 +4404,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4271,6 +4475,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4286,6 +4491,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4303,6 +4509,14 @@ msgstr "채점기" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4319,10 +4533,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4379,75 +4589,76 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points" msgid "Point: " msgstr "포인트" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time" msgid "Time: " msgstr "시간" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Memory" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "포인트" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "오답" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 #, fuzzy #| msgid "judging feedback" msgid "Judge feedback:" msgstr "채점 피드백" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4472,11 +4683,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4500,7 +4711,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4515,34 +4726,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4591,6 +4802,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "사용자 프로파일" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4609,62 +4842,141 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" msgstr[0] "대회 문제" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "allows partial points" +msgid "Total points" +msgstr "부분 점수 허용" + +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "%s Rankings" +msgid "Rank by rating" +msgstr "%s 순위" + +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "%s Rankings" +msgid "Rank by points" +msgstr "%s 순위" + +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:90 +msgid "You have not shared any information." msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s 대회의 문제 %(contest)s" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "Status" +msgid "Sat" +msgstr "현재 상태" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "히스토리" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "모든 제출들" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "제출 테스트 케이스" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "contest rated" +msgid "Contests written" +msgstr "대회 순위" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" @@ -4724,5 +5036,21 @@ msgstr "" msgid "Check all" msgstr "" +#, fuzzy +#~| msgid "contest submission" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "대회 제출" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "관리자" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "재채점" + #~ msgid "output prefix length override" #~ msgstr "출력 접두사 길이 재정의" diff --git a/locale/ko/LC_MESSAGES/djangojs.po b/locale/ko/LC_MESSAGES/djangojs.po index 1a5cecb..285ea15 100644 --- a/locale/ko/LC_MESSAGES/djangojs.po +++ b/locale/ko/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Korean\n" @@ -26,4 +26,3 @@ msgstr[0] "%d일 %h:%m:%s" 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 index 1c740d8..6ed93e7 100644 --- a/locale/lt/LC_MESSAGES/django.po +++ b/locale/lt/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Lithuanian\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: lt\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -137,46 +137,48 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -185,11 +187,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -198,11 +200,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -211,7 +213,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -220,15 +222,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -236,15 +238,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -266,8 +268,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -328,6 +331,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -362,7 +366,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -409,7 +413,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -422,8 +426,8 @@ msgstr[3] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -434,8 +438,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -449,7 +454,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -498,6 +503,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -510,7 +519,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -522,11 +531,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -546,7 +557,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -554,12 +565,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -621,7 +632,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -658,431 +669,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1122,7 +1175,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1130,7 +1183,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1154,15 +1207,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1322,7 +1379,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1395,188 +1452,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1649,7 +1706,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1745,31 +1802,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1860,86 +1917,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1968,7 +2025,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2161,12 +2218,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2178,60 +2244,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2280,8 +2346,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2289,7 +2355,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2306,7 +2372,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2314,131 +2380,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2468,73 +2543,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2543,7 +2619,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2552,84 +2628,85 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2670,22 +2747,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2736,24 +2813,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2769,13 +2846,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2829,10 +2906,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2883,42 +2956,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2956,7 +3037,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2971,53 +3052,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3025,6 +3106,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3033,76 +3119,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3135,7 +3223,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3223,6 +3312,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3252,7 +3346,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3265,7 +3359,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3277,29 +3371,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3331,62 +3424,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3437,15 +3552,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3457,39 +3576,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3598,58 +3725,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3682,7 +3834,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3718,35 +3870,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3758,28 +3910,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3788,86 +3944,88 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3876,67 +4034,63 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" @@ -3944,7 +4098,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" @@ -3952,16 +4106,16 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" @@ -3969,23 +4123,28 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4013,25 +4172,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4200,20 +4359,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4271,6 +4430,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4286,6 +4446,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4301,6 +4462,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4317,10 +4486,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4377,63 +4542,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4458,11 +4624,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4486,7 +4652,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4501,34 +4667,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4577,6 +4743,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4595,31 +4781,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4628,31 +4790,116 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/lt/LC_MESSAGES/djangojs.po b/locale/lt/LC_MESSAGES/djangojs.po index de87146..7f6fc81 100644 --- a/locale/lt/LC_MESSAGES/djangojs.po +++ b/locale/lt/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Lithuanian\n" @@ -10,7 +10,8 @@ msgstr "" "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" +"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" @@ -29,4 +30,3 @@ msgstr[3] "" 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 index 66c87cd..a300f0f 100644 --- a/locale/nl/LC_MESSAGES/django.po +++ b/locale/nl/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Dutch\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: nl\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -132,90 +132,92 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -223,15 +225,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -311,6 +314,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -343,7 +347,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -390,7 +394,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -413,8 +417,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -428,7 +433,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -501,11 +510,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -525,7 +536,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -533,12 +544,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -600,7 +611,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -637,431 +648,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1101,7 +1154,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1109,7 +1162,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1133,15 +1186,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1301,7 +1358,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1374,188 +1431,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1628,7 +1685,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1724,31 +1781,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1839,86 +1896,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1947,7 +2004,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2140,12 +2197,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2157,60 +2223,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2253,8 +2319,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2262,7 +2328,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2279,7 +2345,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2287,131 +2353,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2441,164 +2516,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2639,22 +2716,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2703,24 +2780,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2736,13 +2813,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2796,10 +2873,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2850,42 +2923,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2923,7 +3004,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2938,53 +3019,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2992,6 +3073,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3000,76 +3086,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3102,7 +3190,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3190,6 +3279,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3219,7 +3313,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3232,7 +3326,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3244,29 +3338,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3298,62 +3391,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3404,15 +3519,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3424,39 +3543,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3565,58 +3692,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3649,7 +3801,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3685,35 +3837,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3725,28 +3877,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3755,196 +3911,199 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3972,25 +4131,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4157,20 +4316,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4228,6 +4387,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4243,6 +4403,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4258,6 +4419,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4274,10 +4443,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4334,63 +4499,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4415,11 +4581,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4443,7 +4609,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4458,34 +4624,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4534,6 +4700,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4552,62 +4738,123 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/nl/LC_MESSAGES/djangojs.po b/locale/nl/LC_MESSAGES/djangojs.po index 0f23d9b..76dc02d 100644 --- a/locale/nl/LC_MESSAGES/djangojs.po +++ b/locale/nl/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Dutch\n" @@ -27,4 +27,3 @@ msgstr[1] "" 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 index caea4c1..c85a4bf 100644 --- a/locale/pl/LC_MESSAGES/django.po +++ b/locale/pl/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Polish\n" @@ -18,93 +18,93 @@ msgstr "" "X-Crowdin-Language: pl\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Niemiecki" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Angielski" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Hiszpański" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Francuski" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Chorwacki" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "Węgierski" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Koreański" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Rumuński" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Rosyjski" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Serbski (alfabet łaciński)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "Turecki" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Wietnamski" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Chiński Uproszczony" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Logowanie" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Strona główna" @@ -138,46 +138,48 @@ msgstr "Pokaż komentarze" msgid "Associated page" msgstr "Dołączona strona" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Załączniki" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Problem" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Planowanie" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Szczegóły" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Ocena" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -186,11 +188,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -199,11 +201,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -212,7 +214,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -221,15 +223,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -237,15 +239,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -267,8 +269,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -329,6 +332,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -363,7 +367,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -410,7 +414,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -423,8 +427,8 @@ msgstr[3] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -435,8 +439,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -450,7 +455,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -499,6 +504,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -511,7 +520,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -523,11 +532,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -547,7 +558,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -555,12 +566,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -622,7 +633,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -659,431 +670,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1123,7 +1176,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1131,7 +1184,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1155,15 +1208,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1323,7 +1380,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1396,188 +1453,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1650,7 +1707,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1746,31 +1803,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1861,86 +1918,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1969,7 +2026,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2162,12 +2219,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2179,60 +2245,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2281,8 +2347,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2290,7 +2356,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2307,7 +2373,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2315,131 +2381,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2469,73 +2544,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2544,7 +2620,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2553,84 +2629,85 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2671,22 +2748,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2737,24 +2814,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2770,13 +2847,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2830,10 +2907,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2884,42 +2957,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2957,7 +3038,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2972,53 +3053,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3026,6 +3107,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3034,76 +3120,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3136,7 +3224,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3224,6 +3313,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3253,7 +3347,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3266,7 +3360,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3278,29 +3372,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3332,62 +3425,86 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organization" +msgid "Organizations..." +msgstr "Organizacja" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3438,15 +3555,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organizacja" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3458,41 +3579,49 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem" msgid "Problem AC Rate" msgstr "Problem" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3601,58 +3730,85 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organization" +msgid "Organization news" +msgstr "Organizacja" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3685,7 +3841,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3721,35 +3877,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3761,28 +3917,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3791,86 +3951,88 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3879,67 +4041,63 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" @@ -3947,7 +4105,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "Problem" msgid "Problem type" @@ -3957,16 +4115,16 @@ msgstr[1] "Problem" msgstr[2] "Problem" msgstr[3] "Problem" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" @@ -3974,23 +4132,28 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4018,25 +4181,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4205,20 +4368,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4276,6 +4439,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4291,6 +4455,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4306,6 +4471,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4322,10 +4495,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4382,63 +4551,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4463,11 +4633,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4491,7 +4661,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4506,34 +4676,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4582,6 +4752,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4600,31 +4790,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4633,31 +4799,120 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rating" +msgid "Rank by rating" +msgstr "Ocena" + +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "Rating" +msgid "Rating History" +msgstr "Ocena" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/pl/LC_MESSAGES/djangojs.po b/locale/pl/LC_MESSAGES/djangojs.po index f30632e..77ffced 100644 --- a/locale/pl/LC_MESSAGES/djangojs.po +++ b/locale/pl/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Polish\n" @@ -10,7 +10,9 @@ msgstr "" "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" +"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" @@ -29,4 +31,3 @@ msgstr[3] "" 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 index 3102d86..9c6b116 100644 --- a/locale/pt/LC_MESSAGES/django.po +++ b/locale/pt/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Portuguese, Brazilian\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: pt-BR\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -132,90 +132,92 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -223,15 +225,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -311,6 +314,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -343,7 +347,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -390,7 +394,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -413,8 +417,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -428,7 +433,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -501,11 +510,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -525,7 +536,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -533,12 +544,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -600,7 +611,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -637,431 +648,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1101,7 +1154,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1109,7 +1162,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1133,15 +1186,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1301,7 +1358,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1374,188 +1431,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1628,7 +1685,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1724,31 +1781,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1839,86 +1896,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1947,7 +2004,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2140,12 +2197,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2157,60 +2223,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2253,8 +2319,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2262,7 +2328,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2279,7 +2345,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2287,131 +2353,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2441,164 +2516,166 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" msgstr[1] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2639,22 +2716,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2703,24 +2780,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2736,13 +2813,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2796,10 +2873,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2850,42 +2923,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2923,7 +3004,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2938,53 +3019,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2992,6 +3073,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3000,76 +3086,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3102,7 +3190,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3190,6 +3279,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3219,7 +3313,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3232,7 +3326,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3244,29 +3338,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3298,62 +3391,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3404,15 +3519,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3424,39 +3543,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3565,58 +3692,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3649,7 +3801,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3685,35 +3837,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3725,28 +3877,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3755,196 +3911,199 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3972,25 +4131,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4157,20 +4316,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4228,6 +4387,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4243,6 +4403,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4258,6 +4419,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4274,10 +4443,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4334,63 +4499,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4415,11 +4581,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4443,7 +4609,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4458,34 +4624,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4534,6 +4700,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4552,62 +4738,123 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/pt/LC_MESSAGES/djangojs.po b/locale/pt/LC_MESSAGES/djangojs.po index 0bcbd6f..24c5cf2 100644 --- a/locale/pt/LC_MESSAGES/djangojs.po +++ b/locale/pt/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Portuguese, Brazilian\n" @@ -27,4 +27,3 @@ msgstr[1] "" 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 index 40e8f38..c1dc332 100644 --- a/locale/ro/LC_MESSAGES/django.po +++ b/locale/ro/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Romanian\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: ro\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "Germană" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "Engleză" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "Franceză" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Română" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "Rusă" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Chineză simplificată" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Login" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Start" @@ -135,46 +135,48 @@ msgstr "Reafişează comentariile" msgid "Associated page" msgstr "Pagină associată" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Concursuri incluse" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Problemă" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Programare" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Detalii" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Rating" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Justiţie" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -182,11 +184,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -194,11 +196,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -206,7 +208,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -214,15 +216,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -230,15 +232,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Conţinut" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Rezumat" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -260,8 +262,9 @@ msgid "Taxonomy" msgstr "Taxonomie" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Puncte" @@ -320,6 +323,7 @@ msgid "User" msgstr "Utilizator" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" @@ -353,7 +357,7 @@ msgstr "Probleme nepermise" 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Descriere" @@ -400,7 +404,7 @@ msgstr "Nu aveţi permisiunea de a rejuriza ATÂT de multe submisii." msgid "Rejudge the selected submissions" msgstr "Rejurizează submisiile selectate" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -412,8 +416,8 @@ msgstr[2] "%d submisii au fost repunctate cu succes." msgid "Rescore the selected submissions" msgstr "Repunctează submisiile selectate" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Codul problemei" @@ -424,8 +428,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Ora" @@ -439,7 +444,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -488,6 +493,10 @@ msgstr "" msgid "ECOO" msgstr "ECOO" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "IOI" @@ -500,7 +509,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -514,11 +523,13 @@ msgstr "evaluator" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Nume de utilizator" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -538,7 +549,7 @@ msgstr "Codul problemei trebuie să fie ^[a-z0-9]+$" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Identificatorul de concurs trebuie să fie ^[a-z0-9]+$" @@ -546,12 +557,12 @@ msgstr "Identificatorul de concurs trebuie să fie ^[a-z0-9]+$" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "N j, Y, g:i a" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -613,7 +624,7 @@ msgstr "comentariu" msgid "comments" msgstr "comentarii" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -652,433 +663,485 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Culoare invalida." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "nume de etichetă" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "culoare de eticheta" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "descrierea etichetei" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "eticheta concursului" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "etichetele concursului" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Aceste persoane vor putea să editeze concursul." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Aceste persoane vor putea să editeze concursul." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Aceste persoane vor putea să editeze concursul." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "probleme" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Dacă acest concurs poate fi evaluat." -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "Evaluează toţi utilizatorii care s-au inscris." - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." -msgstr "" +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Aceste persoane vor putea să editeze concursul." #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "Evaluează toţi utilizatorii care s-au inscris." + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "organizații" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 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:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "Imagine OpenGraph" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "problemele din concurs" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "concurs" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "concursuri" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "scor" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "participarea la concurs" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "participările la concurs" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "problemă" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "puncte" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "testele submisiei" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "problema din concurs" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "problemele din concurs" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "submisie" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "submisie de concurs" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "submisii de concurs" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "rating de la concurs" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "ratinguri de la concurs" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1118,7 +1181,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1126,7 +1189,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1150,15 +1213,21 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "Dacă e privat, doar aceste organizaţii pot vedea acest concurs" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "postare pe blog" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "postări pe blog" @@ -1318,7 +1387,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1391,188 +1460,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "limbaj" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "limita de resurse specifică limbii" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "limite de resurse specifică limbii" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "soluţie" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "soluţii" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1645,7 +1714,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "organizație" @@ -1741,31 +1810,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "profil utilizator" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "profiluri utilizatori" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "cerere de a se alătura organizaţiei" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "cereri de a se alătura organizaţiei" @@ -1856,88 +1925,88 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "limbaje" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "Numele server-ului, in stil de hostname" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "O cheie de autentificare pentru acest judge" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 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:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "evaluatoare" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "evaluator" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "Accepted" @@ -1966,7 +2035,7 @@ 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:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "Compile Error" @@ -2161,12 +2230,24 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "Pagina %d din Posturi" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Recalculați scorurile" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2178,60 +2259,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "Nu se poate trece amândoua queryset şi filtrele cu cuvinte cheie" @@ -2277,8 +2358,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "Despre" @@ -2286,7 +2367,7 @@ msgstr "Despre" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "Pagina %d din Posturi" @@ -2303,7 +2384,7 @@ msgstr "" msgid "You already voted." msgstr "Ai votat deja." -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "Editat de pe site" @@ -2311,132 +2392,142 @@ msgstr "Editat de pe site" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "Niciun concurs de acest fel" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "Niciun concurs găsit cu cheia \"%s\"." -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "Concursuri" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "Nu am putut găsi un concurs de acest fel." -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "Nu aveți acces la concursul \"%s\"" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "Concursul nu este în curs de desfăşurare" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "Momentan, \"%s\" nu este în curs de desfăşurare." -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "Deja în concurs" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Sunteţi deja într-un concurs: \"%s\"." -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "Nu sunteţi în concursul \"%s\"." -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "Concursuri în %(month)s" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "Stastici" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "Best solutions for %s" +msgid "New clarification for %s" +msgstr "Cele mai bune soluţii pentru %s" + #: judge/views/error.py:14 msgid "404 error" msgstr "eroare 404" @@ -2466,73 +2557,74 @@ msgstr "Limbaje" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "Nicio organizaţie de acest fel" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "Nicio organizaţie găsită cu cheia \"%s\"." -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "Organizaţii" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s Membri" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "Aderarea la organizaţie" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "Sunteţi deja în organizaţie." -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "Această organizaţie nu este deschisă." -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "Părăsire organizaţie" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "Nu sunteţi în \"%s\"." -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "Cerere de adăugare la %s" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "Detalii despre cererea de adăugare" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "Gestionarea cererilor de asociere cu %s" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2540,7 +2632,7 @@ msgstr[0] "Aprobat %d utilizator." msgstr[1] "Aprobat %d utilizatori." msgstr[2] "Aprobat %d utilizatori." -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2548,65 +2640,66 @@ msgstr[0] "Respins %d utilizator." msgstr[1] "Respins %d utilizatori." msgstr[2] "Respins %d utilizatori." -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "Editare %s" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "Nu puteţi edita organizaţia" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 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 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "Nicio problemă de acest fel" -#: judge/views/problem.py:70 +#: 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:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Probleme" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." @@ -2614,20 +2707,20 @@ msgstr "" "Ați fost declarat \"persoană neacceptată\" pentru această problemă. Sunteți " "exclus definitiv de la submiterea acestei probleme." -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2668,22 +2761,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2737,7 +2830,7 @@ msgstr "Limba preferată" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2746,7 +2839,7 @@ msgstr "" "Adresa de email \"%s\" a fost deja folosită. O singură înregistrare este " "permisă pe fiecare adresă." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -2754,11 +2847,11 @@ msgstr "" "Furnizorul dvs. de e-mail nu este permis datorită istoriei de abuz. Vă rugăm " "să folosiţi un furnizor de e-mail respectabil." -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Înregistrare" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "Problemă la autentificare" @@ -2774,13 +2867,13 @@ msgstr "Stare" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "Soluţia problemei %(problem)s de %(user)s" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "Toate soluţile" @@ -2836,10 +2929,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2890,42 +2979,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "Niciun astfel de utilizator" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "Porecla de utilizator \"%s\" nu există." -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "Utilizatorul %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "M j, Y, G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "Actualizat pe loc" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "Editează-ți profilul" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2963,7 +3062,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "Vezi soluții" @@ -2978,53 +3077,53 @@ msgstr "Editează utilizator" msgid "Rejudge" msgstr "Rejurizeză" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "Bună ziua, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Log out" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Autentificare" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "sau" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 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/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Modifică" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3032,6 +3131,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "Updated on site" +msgid "posted on {time}" +msgstr "Actualizat pe loc" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3040,82 +3145,83 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "Blog" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "Evenimente" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "Updated on site" -msgid "posted on {time}" -msgstr "Actualizat pe loc" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Concursuri in desfășurare" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Concursuri programate" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "Probleme noi" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Comentarii" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Online Judge" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "Administrare" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Utilizatori" +#| msgid "Delete?" +msgid "Delete" +msgstr "Ştergeţi?" #: templates/comments/list.html:2 msgid "Comments" @@ -3148,7 +3254,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3238,6 +3345,11 @@ msgstr "Vineri" msgid "Saturday" msgstr "Sâmbătă" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Crează" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3267,7 +3379,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3282,7 +3394,7 @@ msgstr "Stastici" msgid "Rankings" msgstr "Rang" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3294,29 +3406,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "Părăsiți concursul" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "Intră în concurs" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3349,62 +3460,88 @@ msgstr "%(length)s lung începând la %(start_time)s" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Utilizatori" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "Organizaţii" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Intră" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "Căutaţi problemele..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Concurs" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Concursuri in desfășurare" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Concursuri programate" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "Nu există concursuri programate în acest moment." -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Concursuri terminate" @@ -3455,15 +3592,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "Numai următoarele organizații pot accesa acest concurs:" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organizație" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "nume complet" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3475,44 +3618,54 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "nume complet" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "contest participation" +msgid "Show virtual participation" +msgstr "participarea la concurs" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem type" #| msgid_plural "Problem types" msgid "Problem AC Rate" msgstr "Tip de problemă" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "Soluții după limbă" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "Procent soluții corecte (AC) după limbă" @@ -3640,58 +3793,97 @@ msgstr "activează" msgid "Update" msgstr "Actualizare" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "Alăturaţi-vă organizaţiei" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "Cerere de membru" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "Organizaţii" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "Nu există concursuri programate în acest moment." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Concurs" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "Editează organizaţia" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "Vezi solicitări" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "Vezi membrii" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "Părăsiţi organizaţia" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "Rate all ratable contests" +msgid "New private contests" +msgstr "Dă o notă la toate concursurile adecvate" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "Versiune PDF" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "Probleme noi" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "organizations" +msgid "Show my organizations only" +msgstr "organizații" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "Nume" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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:" @@ -3724,7 +3916,7 @@ msgid "There are no requests to approve." msgstr "Nu aveți cereri de aprobare." #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "Ştergeţi?" @@ -3760,37 +3952,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Informație" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3802,28 +3994,34 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "Categorie" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "Tipuri" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Best solutions for %s" +msgid "Add clarifications" +msgstr "Cele mai bune soluţii pentru %s" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3832,87 +4030,90 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "All submissions" +msgid "Download selected submissions" +msgstr "Toate soluţile" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "Repunctează submisiile selectate" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "Versiune PDF" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "Trimite soluţie" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, fuzzy, python-format #| msgid "contest submission" msgid "%(counter)s submission left" @@ -3921,76 +4122,70 @@ msgstr[0] "submisie de concurs" msgstr[1] "submisie de concurs" msgstr[2] "submisie de concurs" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "Soluţiile mele" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "Cele mai bune soluţii" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "All submissions" -msgid "Download AC submissions" -msgstr "Toate soluţile" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "Schimbă problema" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "Duplică problemă" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "Puncte:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(parţial)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "Limita de timp:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "Limita de memorie:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "Autor:" msgstr[1] "Autori:" msgstr[2] "Autori:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "problem type" msgid "Problem type" @@ -3999,16 +4194,16 @@ msgstr[0] "tipul problemei" msgstr[1] "tipul problemei" msgstr[2] "tipul problemei" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "Limbajele acceptate" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "Nici un judge pentru %(lang)s e online" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judges" msgid "Judge:" @@ -4017,23 +4212,28 @@ msgstr[0] "Judges" msgstr[1] "Judges" msgstr[2] "Judges" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4061,25 +4261,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "Toate" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "Caută" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "Aleatoriu" @@ -4251,20 +4451,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "Înscrie-te!" @@ -4322,6 +4522,7 @@ msgid "Ping" msgstr "Ping" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "Încărcare" @@ -4337,6 +4538,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "ID" @@ -4352,6 +4554,14 @@ msgstr "Judges" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "O eroare internă a apărut în timpul notării." @@ -4368,10 +4578,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4428,73 +4634,74 @@ msgstr "" msgid "Execution Results" msgstr "Rezultate de executare" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "Lot " - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "Puncte:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Ora:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory limit:" msgid "Memory: " msgstr "Limita de memorie:" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "Lot " + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "Caz" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "Pretest" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Caz de test" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Puncte" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "Caz" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "Pretest" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Caz de test" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "Wrong Answer" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "Soluția a fost anulată!" @@ -4519,11 +4726,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4547,7 +4754,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4562,34 +4769,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "Nimic aici." -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "Rang" @@ -4638,6 +4845,28 @@ msgstr "Script de utilizator" msgid "Update profile" msgstr "Actualizați profilul" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "profil utilizator" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4656,31 +4885,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "De la" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "Nu aţi împărtăşit nicio informaţie." - -#: templates/user/user-about.html:56 -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 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" msgid "%(counter)s problem solved" @@ -4689,31 +4894,144 @@ msgstr[0] "problemele din concurs" msgstr[1] "problemele din concurs" msgstr[2] "problemele din concurs" -#: templates/user/user-base.html:50 -msgid "Rank by points:" -msgstr "Clasament după puncte:" - -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "Numărul total de puncte:" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by rating:" +msgid "Rank by rating" msgstr "Clasament după rating:" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "Rating:" +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "Clasament după puncte:" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:64 +msgid "From" +msgstr "De la" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "Nu aţi împărtăşit nicio informaţie." + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "Acest utilizator nu a împărtăşit nicio informaţie." + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s în %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Luni" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Marți" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Joi" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Vineri" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "Stare" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Duminică" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Istoric" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "Toate soluţile" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "testul submisiei" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "Contests" +msgid "Contests written" +msgstr "Concursuri" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "Volatilitate:" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" @@ -4775,6 +5093,27 @@ msgstr "Editează-ți profilul" msgid "Check all" msgstr "Selectează tot" +#, fuzzy +#~| msgid "contest submission" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "submisie de concurs" +#~ msgstr[1] "submisie de concurs" +#~ msgstr[2] "submisie de concurs" + +#~ msgid "Rating:" +#~ msgstr "Rating:" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "Administrare" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "Repunctează submisiile selectate" + #~ msgid "Your output (clipped)" #~ msgstr "Output-ul tau (micșorat)" diff --git a/locale/ro/LC_MESSAGES/djangojs.po b/locale/ro/LC_MESSAGES/djangojs.po index 18cb4f6..19ea47d 100644 --- a/locale/ro/LC_MESSAGES/djangojs.po +++ b/locale/ro/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Romanian\n" @@ -10,7 +10,8 @@ msgstr "" "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" +"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" @@ -28,4 +29,3 @@ msgstr[2] "%d zile %h:%m:%s" 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 index b61ec3d..45d6e25 100644 --- a/locale/ru/LC_MESSAGES/django.po +++ b/locale/ru/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Russian\n" @@ -18,93 +18,93 @@ msgstr "" "X-Crowdin-Language: ru\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "пользователь" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "время публикации" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "тело комментария" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "немецкий" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "английский" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "Испанский" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "французский" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "Хорватский" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "Корейский" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "Румынский" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "русский" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "Сербский (латиница)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "Турецкий" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "Вьетнамский" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "Упрощенный китайский" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Войти" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Главная" @@ -138,46 +138,48 @@ msgstr "Показать комментарии" msgid "Associated page" msgstr "Связанная страница" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Включены конкурсы" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "Проблема" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Расписание" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Детали" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Рейтинг" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Судья" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -186,11 +188,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -199,11 +201,11 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -212,7 +214,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -221,15 +223,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "имя пользователя" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "виртуальный" @@ -237,15 +239,15 @@ msgstr "виртуальный" msgid "link path" msgstr "адресс ссылки" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "Содержание" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Сводка" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -267,8 +269,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Очки" @@ -329,6 +332,7 @@ msgid "User" msgstr "Пользователь" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Эл. почта" @@ -363,7 +367,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "Решения этих задач нельзя сдавать на этом языке" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Описание" @@ -410,7 +414,7 @@ msgstr "У вас нет доступа перетестировать ТАК м msgid "Rejudge the selected submissions" msgstr "Перетестировать выбранные посылки" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -423,8 +427,8 @@ msgstr[3] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Исходный код" @@ -435,8 +439,9 @@ msgstr "Название задачи" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Время" @@ -450,7 +455,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Память" @@ -499,6 +504,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -511,7 +520,7 @@ msgstr "Уведомлять об изменениях в соревновани msgid "Enable experimental features" msgstr "Включить экспериментальные возможности" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "Вы не можете состоять более чем в {count} публичных организациях." @@ -523,11 +532,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Имя пользователя" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Пароль" @@ -547,7 +558,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -555,12 +566,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -622,7 +633,7 @@ msgstr "комментарий" msgid "comments" msgstr "комментарии" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "Разбор задач для %s" @@ -661,431 +672,487 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Недопустимый цвет." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Только буквы нижнего регистра и дефисы." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "цвет тега" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "описание тега" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "тег соревнования" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "теги соревнования" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "название соревнования" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Эти люди будут иметь право изменять соревнование." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Эти люди будут иметь право изменять соревнование." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Эти люди будут иметь право изменять соревнование." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "описание" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "задачи" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "время начала" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "время конца" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "ограничение по памяти" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "соревнование рейтинговое" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Будте ли соревнование рейтинговым." -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "скрыть таблицу" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "Должна ли таблица быть скрыта на протяжении соревнования." - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "без комментариев" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "Используйте систему кларов вместо комментариев." - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" +msgstr "Должна ли таблица быть скрыта на протяжении соревнования." + +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "hide scoreboard" +msgid "view contest scoreboard" +msgstr "скрыть таблицу" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Эти люди будут иметь право изменять соревнование." + +#: judge/models/contest.py:88 +msgid "no comments" +msgstr "без комментариев" + +#: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "Используйте систему кларов вместо комментариев." + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "спрятать тэги задач" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "запустить только претесты" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "организации" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "соревнование" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "соревнования" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "участие в соревновании" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "задача" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "очки" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "частичный" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "порядок" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "посылка" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "участие" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "ранг" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "рейтинг" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1125,7 +1192,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "авторы" @@ -1133,7 +1200,7 @@ msgstr "авторы" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1157,15 +1224,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1325,7 +1396,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1398,188 +1469,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "язык" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1652,7 +1723,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1748,31 +1819,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1863,86 +1934,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "Языки" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1971,7 +2042,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2166,12 +2237,23 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Пересчитать баллы" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2183,60 +2265,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2285,8 +2367,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "О нас" @@ -2294,7 +2376,7 @@ msgstr "О нас" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2311,7 +2393,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2319,132 +2401,141 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "Статистика" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "Онлайн" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2474,73 +2565,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2549,7 +2641,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2558,84 +2650,85 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Задачи" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2676,22 +2769,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2742,24 +2835,24 @@ msgstr "Предпочитаемый язык" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Регистрация" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "Ошибка авторизации" @@ -2775,13 +2868,13 @@ msgstr "Статус" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2835,10 +2928,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2889,42 +2978,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "Пользователь %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2962,7 +3059,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2977,53 +3074,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Bыйти" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Войти" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Редактировать" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3031,6 +3128,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "posted time" +msgid "posted on {time}" +msgstr "время публикации" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3039,82 +3142,81 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "Блог" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "События" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "Новости" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "posted time" -msgid "posted on {time}" -msgstr "время публикации" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Текущие соревнования" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Предстоящие соревнования" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Онлайн Judge" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -#, fuzzy -#| msgid "Admin User" -msgid "Admins" -msgstr "Администратор" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Пользователи" +#: templates/chat/message.html:20 +msgid "Delete" +msgstr "" #: templates/comments/list.html:2 msgid "Comments" @@ -3148,7 +3250,8 @@ msgstr "Ссылка" msgid "Reply" msgstr "Ответить" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3238,6 +3341,11 @@ msgstr "Пятница" msgid "Saturday" msgstr "Суббота" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Создать" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3267,7 +3375,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3280,7 +3388,7 @@ msgstr "Статистика" msgid "Rankings" msgstr "Рейтинг" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 #, fuzzy #| msgid "Rankings" msgid "Hidden Rankings" @@ -3294,29 +3402,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "Покинуть соревнование" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "Виртуальное участие" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "Присоединиться к соревнованию" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3348,62 +3455,88 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Пользователи" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organization" +msgid "Organizations..." +msgstr "Организация" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Присоединиться" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Leave contest" +msgid "Search contests..." +msgstr "Покинуть соревнование" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Соревнование" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Текущие Соревнования" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Предстоящие соревнования" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Прошедшие соревнования" @@ -3455,15 +3588,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Организация" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "Name" +msgid "Full Name" +msgstr "Имя" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3479,41 +3618,51 @@ msgstr "Вы уверены, что вы хотите выйти?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "Вы уверены, что вы хотите выйти?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "contest participation" +msgid "Show virtual participation" +msgstr "участие в соревновании" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Название задачи" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3630,58 +3779,97 @@ msgstr "активировать" msgid "Update" msgstr "Обновить" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "Присоединиться к организации" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organization" +msgid "Organization news" +msgstr "Организация" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no comments at the moment." +msgid "There is no news at this time." +msgstr "Еще нет ни одного комментария." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Соревнование" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "Редактировать организацию" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "Просмотр запросов" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "Покинуть организацию" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "Leave contest" +msgid "New private contests" +msgstr "Покинуть соревнование" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "Просмотр в формате PDF" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "Edit problem" +msgid "New private problems" +msgstr "Редактировать задачу" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "organizations" +msgid "Show my organizations only" +msgstr "организации" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "Имя" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "Пользователь:" @@ -3714,7 +3902,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3750,37 +3938,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Информация" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "Тип" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "Добавить новый пример" @@ -3792,28 +3980,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "Категория" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "Типы" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3822,87 +4014,91 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "submission" +msgid "Download selected submissions" +msgstr "посылка" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to leave?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "Вы уверены, что вы хотите выйти?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "Просмотр в формате PDF" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3911,69 +4107,63 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "submission" -msgid "Download AC submissions" -msgstr "посылка" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "Редактировать задачу" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 #, fuzzy #| msgid "Authors" msgid "Author:" @@ -3983,7 +4173,7 @@ msgstr[1] "Авторы" msgstr[2] "Авторы" msgstr[3] "Авторы" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 #, fuzzy #| msgid "Problem code" msgid "Problem type" @@ -3993,16 +4183,16 @@ msgstr[1] "Исходный код" msgstr[2] "Исходный код" msgstr[3] "Исходный код" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" @@ -4010,23 +4200,28 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4054,25 +4249,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "Все" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "Случайная задача" @@ -4241,20 +4436,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "Уведомлять меня о предстоящих соревнованиях" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "Условия использования" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "Зарегистрироваться!" @@ -4312,6 +4507,7 @@ msgid "Ping" msgstr "Пинг" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "Загрузка" @@ -4327,6 +4523,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "ID" @@ -4342,6 +4539,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4358,10 +4563,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4418,71 +4619,72 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points" msgid "Point: " msgstr "Очки" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Время:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Память" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Очки" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4507,11 +4709,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4535,7 +4737,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4550,34 +4752,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 #, fuzzy #| msgid "Rankings" @@ -4628,6 +4830,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "User %s" +msgid "User File" +msgstr "Пользователь %s" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4646,31 +4870,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "От" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4679,31 +4879,144 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "points" +msgid "Total points" +msgstr "очки" + +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Max rating:" +msgid "Rank by rating" +msgstr "Макс рейтинг:" + +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rankings" +msgid "Rank by points" +msgstr "Рейтинг" + +#: templates/user/user-about.html:64 +msgid "From" +msgstr "От" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:90 +msgid "You have not shared any information." msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "Рейтинг:" +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s в %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Понедельник" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Вторник" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Четверг" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Пятница" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "Status" +msgid "Sat" +msgstr "Статус" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Воскресенье" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "История" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "submission" +msgid "total submission(s)" +msgstr "посылка" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission" +msgid "submissions in the last year" +msgstr "посылка" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "contest rated" +msgid "Contests written" +msgstr "соревнование рейтинговое" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "Мин рейтинг:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "Макс рейтинг:" @@ -4760,3 +5073,11 @@ msgstr "Профиль администратора" #: templates/widgets/select_all.html:8 msgid "Check all" msgstr "Выбрать всё" + +#~ msgid "Rating:" +#~ msgstr "Рейтинг:" + +#, fuzzy +#~| msgid "Admin User" +#~ msgid "Admins" +#~ msgstr "Администратор" diff --git a/locale/ru/LC_MESSAGES/djangojs.po b/locale/ru/LC_MESSAGES/djangojs.po index ba308f5..3b8eac2 100644 --- a/locale/ru/LC_MESSAGES/djangojs.po +++ b/locale/ru/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Russian\n" @@ -10,7 +10,9 @@ msgstr "" "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" +"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" @@ -29,4 +31,3 @@ msgstr[3] "%d дней %h:%m:%s" msgctxt "time format without day" msgid "%h:%m:%s" msgstr "%h:%m:%s" - diff --git a/locale/sr/LC_MESSAGES/django.po b/locale/sr/LC_MESSAGES/django.po index 0f43828..94f6760 100644 --- a/locale/sr/LC_MESSAGES/django.po +++ b/locale/sr/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2016-12-22 21:23-0500\n" "Last-Translator: Icyene \n" "Language-Team: Serbian (Latin)\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: sr-CS\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -135,46 +135,48 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -182,11 +184,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -194,11 +196,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -206,7 +208,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -214,15 +216,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -230,15 +232,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -260,8 +262,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -320,6 +323,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -353,7 +357,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -400,7 +404,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -412,8 +416,8 @@ msgstr[2] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -424,8 +428,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -439,7 +444,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -488,6 +493,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -500,7 +509,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -512,11 +521,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -536,7 +547,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -544,12 +555,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -611,7 +622,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -648,431 +659,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1112,7 +1165,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1120,7 +1173,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1144,15 +1197,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1312,7 +1369,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1385,188 +1442,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1639,7 +1696,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1735,31 +1792,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1850,86 +1907,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1958,7 +2015,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2151,12 +2208,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2168,60 +2234,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2267,8 +2333,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2276,7 +2342,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2293,7 +2359,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2301,131 +2367,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2455,73 +2530,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2529,7 +2605,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2537,84 +2613,85 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2655,22 +2732,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2720,24 +2797,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2753,13 +2830,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2813,10 +2890,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2867,42 +2940,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2940,7 +3021,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2955,53 +3036,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3009,6 +3090,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3017,76 +3103,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3119,7 +3207,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3207,6 +3296,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3236,7 +3330,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3249,7 +3343,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3261,29 +3355,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3315,62 +3408,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3421,15 +3536,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3441,39 +3560,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3582,58 +3709,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3666,7 +3818,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3702,35 +3854,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3742,28 +3894,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3772,86 +3928,88 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3859,113 +4017,114 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3993,25 +4152,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4179,20 +4338,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4250,6 +4409,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4265,6 +4425,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4280,6 +4441,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4296,10 +4465,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4356,63 +4521,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4437,11 +4603,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4465,7 +4631,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4480,34 +4646,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4556,6 +4722,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4574,31 +4760,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4606,31 +4768,116 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/sr/LC_MESSAGES/djangojs.po b/locale/sr/LC_MESSAGES/djangojs.po index db00c34..8276129 100644 --- a/locale/sr/LC_MESSAGES/djangojs.po +++ b/locale/sr/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-11-12 01:20-0500\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2016-12-22 21:23-0500\n" "Last-Translator: Icyene \n" "Language-Team: Serbian (Latin)\n" @@ -10,13 +10,14 @@ msgstr "" "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" +"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 +#: resources/common.js:207 msgctxt "time format with day" msgid "%d day %h:%m:%s" msgid_plural "%d days %h:%m:%s" @@ -24,8 +25,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: .\resources\common.js:188 +#: resources/common.js:210 msgctxt "time format without day" msgid "%h:%m:%s" msgstr "" - diff --git a/locale/sr_Latn/LC_MESSAGES/django.po b/locale/sr_Latn/LC_MESSAGES/django.po index 2d508d6..8c5db5a 100644 --- a/locale/sr_Latn/LC_MESSAGES/django.po +++ b/locale/sr_Latn/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Serbian (Latin)\n" @@ -17,93 +17,93 @@ msgstr "" "X-Crowdin-Language: sr-CS\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "" @@ -135,46 +135,48 @@ msgstr "" msgid "Associated page" msgstr "" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." @@ -182,11 +184,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." @@ -194,11 +196,11 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 judge/admin/submission.py:164 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -206,7 +208,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." @@ -214,15 +216,15 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -230,15 +232,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -260,8 +262,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "" @@ -320,6 +323,7 @@ msgid "User" msgstr "" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "" @@ -353,7 +357,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "" @@ -400,7 +404,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -412,8 +416,8 @@ msgstr[2] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -424,8 +428,9 @@ msgstr "" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "" @@ -439,7 +444,7 @@ msgstr "" msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "" @@ -488,6 +493,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -500,7 +509,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -512,11 +521,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "" @@ -536,7 +547,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -544,12 +555,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -611,7 +622,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -648,431 +659,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1112,7 +1165,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1120,7 +1173,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1144,15 +1197,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1312,7 +1369,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "" @@ -1385,188 +1442,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1639,7 +1696,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1735,31 +1792,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1850,86 +1907,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "" @@ -1958,7 +2015,7 @@ msgid "Runtime Error" msgstr "" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "" @@ -2151,12 +2208,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2168,60 +2234,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2267,8 +2333,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2276,7 +2342,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2293,7 +2359,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2301,131 +2367,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2455,73 +2530,74 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." @@ -2529,7 +2605,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." @@ -2537,84 +2613,85 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2655,22 +2732,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2720,24 +2797,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2753,13 +2830,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "" @@ -2813,10 +2890,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2867,42 +2940,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2940,7 +3021,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2955,53 +3036,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3009,6 +3090,11 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3017,76 +3103,78 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 msgid "Online Users" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3119,7 +3207,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3207,6 +3296,11 @@ msgstr "" msgid "Saturday" msgstr "" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3236,7 +3330,7 @@ msgstr "" msgid "Calendar" msgstr "" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3249,7 +3343,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3261,29 +3355,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3315,62 +3408,84 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3421,15 +3536,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3441,39 +3560,47 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 msgid "Problem AC Rate" msgstr "" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3582,58 +3709,83 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +msgid "Organization news" +msgstr "" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3666,7 +3818,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3702,35 +3854,35 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 msgid "Instruction" msgstr "" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3742,28 +3894,32 @@ msgid "" "problem yourself is a bannable offence." msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3772,86 +3928,88 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +msgid "Action" +msgstr "" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" +#: templates/problem/manage_submission.html:171 +msgid "Download selected submissions" msgstr "" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" @@ -3859,113 +4017,114 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -msgid "Download AC submissions" -msgstr "" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3993,25 +4152,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4179,20 +4338,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4250,6 +4409,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4265,6 +4425,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4280,6 +4441,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4296,10 +4465,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4356,63 +4521,64 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " msgstr "" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " msgstr "" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 msgid "Point" msgstr "" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" msgstr "" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4437,11 +4603,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4465,7 +4631,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4480,34 +4646,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4556,6 +4722,26 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4574,31 +4760,7 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" @@ -4606,31 +4768,116 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: templates/user/user-base.html:50 -msgid "Rank by points:" +#: templates/user/user-about.html:35 +msgid "Total points" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/sr_Latn/LC_MESSAGES/djangojs.po b/locale/sr_Latn/LC_MESSAGES/djangojs.po index 4ce08be..faeec8a 100644 --- a/locale/sr_Latn/LC_MESSAGES/djangojs.po +++ b/locale/sr_Latn/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Serbian (Latin)\n" @@ -10,7 +10,8 @@ msgstr "" "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" +"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" @@ -28,4 +29,3 @@ msgstr[2] "" 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 index a4f4d8f..4e2e4e3 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Turkish\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: tr\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "kullanıcı" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "gönderi zamanı" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "yorum metni" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Giriş" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "Ana sayfa" @@ -132,90 +132,92 @@ msgstr "Yorumları göster" msgid "Associated page" msgstr "İlişkili sayfa" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "Yarışmalar" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "Planlama" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "Ayrıntılar" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "Derecelendirme" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "Demir yumruk" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, 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:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, 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:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" msgstr[1] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "kullanıcı adı" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "sanal" @@ -223,15 +225,15 @@ msgstr "sanal" msgid "link path" msgstr "link ucu" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "İçerik" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "Özet" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -253,8 +255,9 @@ msgid "Taxonomy" msgstr "Tasnif" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Puanlar" @@ -311,6 +314,7 @@ msgid "User" msgstr "Kullanıcı" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "E-posta" @@ -343,7 +347,7 @@ msgstr "Yasaklı problemler" 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 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "Tanım" @@ -390,7 +394,7 @@ msgstr "Bu miktarda çözümü yeniden değerlendirme yetkin yok." msgid "Rejudge the selected submissions" msgstr "Seçili çözümleri yeniden değerlendir" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -401,8 +405,8 @@ msgstr[1] "%d çözüm yeniden puanlandı." msgid "Rescore the selected submissions" msgstr "Seçili çözümleri yeniden puanla" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "Problem anahtarı" @@ -413,8 +417,9 @@ msgstr "Problem adı" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Zaman" @@ -428,7 +433,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Bellek" @@ -477,6 +482,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -489,7 +498,7 @@ msgstr "Yarışma güncellemelerine abone ol" msgid "Enable experimental features" msgstr "Deneysel özellikleri aç" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, 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." @@ -503,11 +512,13 @@ msgstr "judge'lar" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Kullanıcı Adı" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Şifre" @@ -527,7 +538,7 @@ msgstr "Problem kodu ^[a-z0-9]+$ olmalıdır" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Yarışma ID'si ^[a-z0-9]+$ olmalıdır" @@ -535,12 +546,12 @@ msgstr "Yarışma ID'si ^[a-z0-9]+$ olmalıdır" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "j M Y, H:i" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -602,7 +613,7 @@ msgstr "yorum" msgid "comments" msgstr "yorumlar" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "%s problemi için editorial" @@ -641,73 +652,103 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "Geçersiz renk." -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "etiket adı" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "Yalnızca küçük harfler ve tire kullanılabilir." -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "etiket rengi" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "etiket tanımı" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "yarışma etiketi" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "yarışma etiketleri" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "View user participation" +msgid "Hidden for duration of participation" +msgstr "Kullanıcı katılımını göster" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "yarışma ID'si" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "yarışma adı" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "Bu kişiler yarışmayı düzenleyebilecekler." -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "Bu kişiler yarışmayı düzenleyebilecekler." + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "Bu kişiler yarışmayı düzenleyebilecekler." + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "Tanım" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "problemler" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "başlangıç" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "bitiş" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "zaman sınırı" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "herkese açık" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -716,76 +757,93 @@ msgstr "" "organizasyona özel ise bu seçenek yarışmanın üyelere açılıp açılmayacağını " "belirler." -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "dereceli yarışma" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "Bu yarışma derecelendirilebilir mi?" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "puan tablosunu gizle" +#: judge/models/contest.py:82 +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "halka açık mı?" -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." +#: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" msgstr "Puan tablosu yarışma boyunca gizli kalmalı mı?" -#: judge/models/contest.py:71 +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "hide scoreboard" +msgid "view contest scoreboard" +msgstr "puan tablosunu gizle" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "Bu kişiler yarışmayı düzenleyebilecekler." + +#: judge/models/contest.py:88 msgid "no comments" msgstr "yorum yok" -#: judge/models/contest.py:72 +#: judge/models/contest.py:89 msgid "Use clarification system instead of comments." msgstr "Yorumlar yerine açıklama sistemini kullanın." -#: judge/models/contest.py:74 +#: judge/models/contest.py:91 msgid "Rating floor for contest" msgstr "" -#: judge/models/contest.py:76 +#: judge/models/contest.py:93 msgid "Rating ceiling for contest" msgstr "" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "rate all" msgstr "herkesi derecelendir" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "Rate all users who joined." msgstr "Katılan tüm kullanıcıları derecelendir" -#: judge/models/contest.py:79 +#: judge/models/contest.py:96 msgid "exclude from ratings" msgstr "derecelendirme dışı kullanıcılar" -#: judge/models/contest.py:81 +#: judge/models/contest.py:98 msgid "private to specific users" msgstr "" -#: judge/models/contest.py:82 +#: judge/models/contest.py:99 msgid "private contestants" msgstr "" -#: judge/models/contest.py:83 +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "problem etiketlerini gizle" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "Problem etiketleri varsayılan olarak gizli olmalı mı?" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "yalnızca ön testleri çalıştır" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -795,50 +853,51 @@ msgstr "" "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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "organizasyonlara özel" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "organizasyonlar" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "Özel ise, sadece bu organizasyonlar yarışmayı görebilirler" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph resmi" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "anlık katılımcı sayısı" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "yarışma özeti" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 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:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "erişim kodu" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." @@ -846,241 +905,255 @@ 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "istenmeyen kişiler" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "test puanı" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "Özel yarışmaları gör" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "Kendi yarışmalarını düzenle" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "Tüm yarışmaları düzenle" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "Yarışmaları derecelendir" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "Yarışma erişim kodları" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "yarışma problemleri" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "yarışma" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "yarışmalar" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "ilişkili yarışma" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "puan" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "kümülatif süre" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "sanal katılım ID'si" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 #, fuzzy #| msgid "0 means non-virtual, otherwise the n-th virtual participation" 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:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "%s, \"%s\" yarışmasında gözlemci" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s, \"%s\" yarışmasında, sanal: %d" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s, \"%s\" yarışmasında" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "yarışma katılımı" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "yarışma katılımı" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "puan" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "kısmi" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "ön testli" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "sıra" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "çözüm testleri" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 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:357 +#: judge/models/contest.py:501 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:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "yarışma problemi" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "yarışma problemleri" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "çözüm" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "katılım" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "Bu çözüm yalnızca pretest'lerde mi çalıştı?" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "yarışma çözümü" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "yarışma çözümleri" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "sıralama" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "derece" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "değişkenlik" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "son derecelendirme" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "yarışma derecesi" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "yarışma derecesi" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1120,7 +1193,7 @@ msgstr "üst nesne" msgid "post title" msgstr "gönderi başlığı" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "yazarlar" @@ -1128,7 +1201,7 @@ msgstr "yazarlar" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "halka açık mı?" @@ -1152,15 +1225,21 @@ msgstr "gönderi özeti" msgid "openGraph image" msgstr "openGraph resmi" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "Özel ise, sadece bu organizasyonlar yarışmayı görebilirler" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "Tüm gönderileri düzenle" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "blog gönderisi" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "blog gönderisi" @@ -1322,7 +1401,7 @@ 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 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "bellek sınırı" @@ -1396,188 +1475,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "dil" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "çevrilmiş ad" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "çevrilmiş tanım" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "problem çevirisi" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "problem çevirisi" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "açıklık getirilmiş problem" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "açıklama içeriği" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "açıklama zaman damgası(timestamp)" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "Dile özel kaynak sınırı" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "Dile özel kaynak sınırları" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "ilgili problem" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "yayın tarihi" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "problem analizi içeriği" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "çözüm" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "çözümler" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "Standart" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "data zip dosyası" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "generator dosyası" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "çıktı öneki uzunluğu" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "çıktı sınır uzunluğu" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "init.yml oluşturma mesajı" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "checker değişkenleri" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "checker değişkenleri, JSON nesnesi olarak" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "test konumu" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "test tipi" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "Normal test" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "Küme başlangıcı" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "küme sonu" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "girdi dosya adı" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "çıktı dosya adı" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "generator değişkenleri" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "puan değeri" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "ön test mi?" @@ -1652,7 +1731,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "Organizasyon" @@ -1748,31 +1827,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "Kullanıcı Profili" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "Kullanıcı Profilleri" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "istek zamanı" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "durum" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "sebep" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "organizasyona katılma isteği" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "organizasyona katılma istekleri" @@ -1875,89 +1954,89 @@ msgstr "uzantı" 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:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "diller" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "bu dil sürümünün ait olduğu dil" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "bu dil sürümünün bulunduğu judge" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "dil sürümü" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "dil sürümü versiyonu" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "dil sürümünün gösterim sırası" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "Server adı, hostname şeklinde" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "oluşturulma zamanı" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "Bu judge'ın kimliğini doğrulamak için bir anahtar" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "kimlik doğrulama anahtarı" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "judge'ın çevrimiçi durumu" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "başlangıç" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "yanıt süresi" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "sistem yükü" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 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:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "judge'lar" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "Kabul edildi" @@ -1986,7 +2065,7 @@ 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:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "Derleme Hatası" @@ -2181,12 +2260,24 @@ msgstr "gönderen" msgid "message time" msgstr "mesaj zamanı" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "[page]/[topage]" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "Sayfa %d" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "Puanları yeniden hesapla" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2198,62 +2289,62 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "Kümeler boş olamaz." -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 #, fuzzy #| msgid "How did you corrupt the generator path?" msgid "How did you corrupt the custom checker path?" msgstr "Generator yolunu bozmayı nasıl becerdin?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, 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:123 +#: judge/utils/problem_data.py:125 #, 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:126 +#: judge/utils/problem_data.py:128 #, 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:151 +#: judge/utils/problem_data.py:153 #, 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:172 +#: judge/utils/problem_data.py:174 #, 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:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "Zip yolunu bozmayı nasıl becerdin?" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "Generator yolunu bozmayı nasıl becerdin?" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "Queryset ve keyword filtreleri aynı anda verilemez." @@ -2296,8 +2387,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "Hakkında" @@ -2305,7 +2396,7 @@ msgstr "Hakkında" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "Sayfa %d" @@ -2322,7 +2413,7 @@ msgstr "" msgid "You already voted." msgstr "Zaten oy verdin." -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "Site aracılığıyla düzenlendi" @@ -2330,132 +2421,142 @@ msgstr "Site aracılığıyla düzenlendi" msgid "Editing comment" msgstr "Yorum düzenleniyor" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "Böyle bir yarışma yok :(" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "\"%s\" anahtarıyla bir yarışma bulunamadı." -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "Yarışmalar" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "Yarışma bulunamadı." -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "\"%s\" yarışmasına erişimin yok " -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "Yarışma devam etmiyor" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" şu anda devam etmiyor." -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "Zaten yarışmadasın" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Zaten bir yarışmadasın: \"%s\"." -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "“%s” için erişim kodunu gir" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "\"%s\" yarışmasında değilsin." -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "%(month)s ayındaki yarışmalar" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "İstatistikler" -#: judge/views/contests.py:601 -msgid "???" -msgstr "???" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "%s - Sıralama" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "\"%s\" yarışmasına katılımın" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, 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:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "Canlı" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "Katılım" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "Yarışma etiketi: %s" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "Sorun açıklaması" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "açıklama içeriği" + #: judge/views/error.py:14 msgid "404 error" msgstr "404 Hatası" @@ -2485,66 +2586,67 @@ msgstr "Dil sürümleri" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "Böyle bir organizasyon yok :(" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "\"%s\" anahtarına sahip bir organizasyon bulunamadı." -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "Organizasyonlar" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s üye" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "Organizasyona katılım" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "Bu organizasyonda zaten varsın." -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "Bu organizasyon açık değil." -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "Organizasyondan çık" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "\"%s\" içinde değilsin." -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "%s'ye katılma isteği" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "Katılma isteği detayı" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "%s - Katılım isteklerini yönet" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2553,99 +2655,100 @@ msgstr "" "Organizasyon yalnızca %d üye daha alabilir. %d üyenin katılımını " "onaylayamazsın." -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, 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 +#: judge/views/organization.py:298 #, 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 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "%s düzenleniyor" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "Bu organizasyon düzenlenemiyor" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "Bu organizasyonu düzenleme yetkisine sahip değilsin." -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 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 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "Bu üyeyi atamazsın." -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "Atmaya çalıştığın üye bulunamıyor!" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, 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:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "Böyle bir problem yok :(" -#: judge/views/problem.py:70 +#: 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:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr " {0} - Problem analizi" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "{0} için problem analizi" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "Problemler" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "Çözüm gönderme engellendi" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 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:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "Çok fazla çözüm gönderisi" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 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:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "Çözüm gönder -%(problem)s" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2686,22 +2789,22 @@ msgstr "%s için verileri düzenle" 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 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2750,7 +2853,7 @@ msgstr "Tercih edilen dil" msgid "Subscribe to newsletter?" msgstr "Haber bültenine abone ol" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " @@ -2758,7 +2861,7 @@ msgid "" msgstr "" "\"%s\" zaten kullanımda. E-posta adresleri yalnızca bir kez kullanılabilir." -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." @@ -2766,11 +2869,11 @@ msgstr "" "E-posta sağlayıcın geçmişte yaşanan suistimallerden dolayı geçersizdir. " "Lütfen bilinen bir e-posta sağlayıcısı kullan." -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Kayıt" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "Kimlik doğrulama hatası" @@ -2786,13 +2889,13 @@ msgstr "Durum" msgid "Version matrix" msgstr "Sürüm matrisi" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, 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:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "Tüm çözümler" @@ -2850,10 +2953,6 @@ msgstr "" msgid "Ticket title" msgstr "Bilet başlığı" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "Sorun açıklaması" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2905,42 +3004,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "Böyle bir kullanıcı yok" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "\"%s\" adında bir kullanıcı yok." -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "Hesabım" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "Kullanıcı %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "j M Y, G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "j M Y, G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "Sitede güncellendi" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "Profili düzenle" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "Sıralama" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2978,7 +3087,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "Gönderileri görüntüle" @@ -2993,53 +3102,53 @@ msgstr "Kullanıcı düzenle" msgid "Rejudge" msgstr "Yeniden değerlendir" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "Merhaba, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "Çıkış yap" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Giriş yap" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "ya da" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "izleniyor" -#: templates/base.html:283 +#: templates/base.html:284 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/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "Düzenle" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3049,6 +3158,11 @@ msgstr "" "\n" "%(time)s" +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time}" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3059,81 +3173,83 @@ msgstr "" "\n" "%(time)s" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "Etkinlikler" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "Haberler" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "{time}" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "Açıklamalar" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "Henüz bir açıklama yapılmadı." -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "Devam eden yarışmalar" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "Gelecek yarışmalar" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "Açık biletlerim" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "Yeni biletler" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "Yeni problemler" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Son yorumlar" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "Online Değerlendirme Sistemi" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "Yönetici" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Kullanıcılar" +#| msgid "Delete?" +msgid "Delete" +msgstr "Sil?" #: templates/comments/list.html:2 msgid "Comments" @@ -3165,7 +3281,8 @@ msgstr "" msgid "Reply" msgstr "Yanıtla" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "Gizle" @@ -3255,6 +3372,11 @@ msgstr "Cuma" msgid "Saturday" msgstr "Cumartesi" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Oluştur" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3284,7 +3406,7 @@ msgstr "Liste" msgid "Calendar" msgstr "Takvim" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "Hakkında" @@ -3297,7 +3419,7 @@ msgstr "İstatistikler" msgid "Rankings" msgstr "Sıralamalar" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "Gizli Sıralamalar" @@ -3309,29 +3431,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "Yarışmadan ayrıl" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "Sanal katılım" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "İzlemeyi bırak" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "Yarışmayı izle" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "Yarışmaya katıl" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "Katılmak için giriş yap" @@ -3365,15 +3486,21 @@ msgstr "başlangıç %(start_time)s, yarışma süresi %(length)s" msgid "AC Rate" msgstr "AC Oranı" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Kullanıcılar" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "Problem analizi" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 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 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." @@ -3381,48 +3508,68 @@ 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 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "Organizasyonlar" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "İzle" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Katıl" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "Problemlerde ara..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "Yarışma" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "Devam Eden Yarışmalar" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "Gelecek yarışmalar" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "Şu anda planlanmış yarışma bulunmuyor." -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "Eski Yarışmalar" @@ -3473,15 +3620,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "Yarışmaya yalnızca şu organizasyonlar erişebilir:" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Organizasyon" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "Tam ad" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3497,47 +3650,59 @@ msgstr "Katılmak istediğine emin misin?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "Katılmak istediğine emin misin?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "Kullanıcı katılımını göster" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "Organizasyonları göster" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "Tam ad" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 #, fuzzy #| msgid "Show my tickets only" msgid "Show friends only" msgstr "Sadece benim biletlerimi göster" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "sanal katılım ID'si" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "problem çevirisi" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "Problem adı" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "problem çevirisi" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "Dillere Göre Çözümler" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "Dil AC Oranı" @@ -3662,58 +3827,97 @@ msgstr "aktifleştir" msgid "Update" msgstr "Güncelle" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "Organizasyona katıl" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "Üyelik talep et" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "Organizasyonlar" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "Şu anda planlanmış yarışma bulunmuyor." + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "Yarışma" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "Organizasyonu düzenle" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "İstekleri göster" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "Organizasyonu düzenle" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "Üyeleri göster" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "Organizasyondan ayrıl" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "See private contests" +msgid "New private contests" +msgstr "Özel yarışmaları gör" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "PDF olarak göster" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "Yeni problemler" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "Show organizations" +msgid "Show my organizations only" +msgstr "Organizasyonları göster" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "İsim" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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ı:" @@ -3746,7 +3950,7 @@ msgid "There are no requests to approve." msgstr "Onaylanacak istek yok." #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "Sil?" @@ -3782,37 +3986,37 @@ msgstr "At" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "Bilgi" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "YAML'i görüntüle" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "Tip" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "Girdi dosyası" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "Çıktı dosyası" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "Ön test?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "Yeni test ekle" @@ -3827,28 +4031,34 @@ msgstr "" "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 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "Tipe göre filtrele..." -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "Popüler problemler" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "Kategori" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "Tipler" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "AC %%" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Clarifications" +msgid "Add clarifications" +msgstr "Açıklamalar" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3857,178 +4067,177 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "Çözümleri filtrele" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "konum" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "Çok fazla çözüm gönderisi" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "Seçili çözümleri yeniden puanla" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to join?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "Katılmak istediğine emin misin?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "PDF olarak göster" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "Çözüm yolla" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, 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 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "0 çözüm kaldı" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "Benim çözümlerim" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "En iyi çözümler" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "Çok fazla çözüm gönderisi" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "Problem analizine git" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "Biletleri yönet" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "Soruyu düzenle" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "Test verisini düzenle" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "Soruyu çoğalt" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "Puan:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(kısmi)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "Zaman sınırı:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "Bellek sınırı:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "Yazar" msgstr[1] "Yazarlar" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "Soru tipi" msgstr[1] "Soru tipleri" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "İzin verilen diller" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "%(lang)s için çevrimiçi judge yok" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judges" msgid "Judge:" @@ -4036,23 +4245,28 @@ msgid_plural "Judges:" msgstr[0] "Judge'lar" msgstr[1] "Judge'lar" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "Açıklama talebi" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "Bir sorun bildir" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4082,25 +4296,25 @@ msgstr "Problem tiplerini göster" msgid "Show editorial" msgstr "Problem analizine git" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "Tümü" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "Problem tipleri" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "Puan aralığı" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "Git" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "Rastgele" @@ -4279,20 +4493,20 @@ msgstr "Varsayılan dil" msgid "Affiliated organizations" msgstr "Organizasyon üyelikleri" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "Gelecek yarışmalar hakkında beni bilgilendir" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "Kayıt olmakla birlikte şunları kabul edersin:" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "Şartlar & Koşullar" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "Kaydol!" @@ -4350,6 +4564,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "Yükle" @@ -4365,6 +4580,7 @@ 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 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4380,6 +4596,14 @@ msgstr "Judge'lar" msgid "Version Matrix" msgstr "Sürüm Matrisi" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "Değerlendirme sırasında bir hata oluştu." @@ -4396,10 +4620,6 @@ msgstr "Duruma göre filtrele..." msgid "Filter by language..." msgstr "Dile göre filtrele..." -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "Çözümleri filtrele" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4456,77 +4676,78 @@ msgstr "Ön Test Sonuçları" msgid "Execution Results" msgstr "Sonuçlar" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "Küme" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "Puan:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "Zaman:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "Bellek" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "Küme" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "Test" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "Ön test" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Test" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "Puanlar" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "Test" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "Ön test" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Test" + +#: templates/submission/status-testcases.html:141 #, fuzzy #| msgid "Input file" msgid "Input:" msgstr "Girdi dosyası" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 #, fuzzy #| msgid "Output file" msgid "Output:" msgstr "Çıktı dosyası" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "Yanlış cevap" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 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:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "Çözüm iptal edildi!" @@ -4551,11 +4772,11 @@ msgstr "En iyi" msgid "%(user)s's" msgstr "%(user)s" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "Yeniden açıldı:" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "Kapatıldı:" @@ -4579,7 +4800,7 @@ msgstr "Sorumlu" msgid "Title" msgstr "Başlık" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "Sorumlular" @@ -4597,34 +4818,34 @@ msgstr "" "dikkate al. Bu form yardım istemek için değildir. Yardıma ihtiyacın varsa, " "sorunu yorumlarda sormayı deneyebilirsin." -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "Gönderi" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "İlişkili nesne" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "Kimse atanmamış." -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "Bileti kapat" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "Bileti yeniden aç" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "Sorumlu notları" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "Burada hiçbir şey yok :(" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "Gönderi" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "Sıralama" @@ -4673,6 +4894,28 @@ msgstr "Userscript" msgid "Update profile" msgstr "Profilini güncelle" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "Kullanıcı Profili" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4693,31 +4936,7 @@ msgstr "%(pp).1fpp" msgid "%(pp).0fpp" msgstr "%(pp).0fpp" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "Organizasyonlar" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "Henüz hiçbir bilgi paylaşmadın." - -#: templates/user/user-about.html:56 -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 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" msgid "%(counter)s problem solved" @@ -4725,31 +4944,153 @@ msgid_plural "%(counter)s problems solved" msgstr[0] "yarışma problemleri" msgstr[1] "yarışma problemleri" -#: templates/user/user-base.html:50 -msgid "Rank by points:" -msgstr "Puan sırası:" - -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "Toplam puan:" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by rating:" +msgid "Rank by rating" msgstr "Derece sırası:" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "Puan sırası:" + +#: templates/user/user-about.html:64 +msgid "From" +msgstr "Organizasyonlar" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "Henüz hiçbir bilgi paylaşmadın." + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "Bu kullanıcı henüz hiçbir bilgi paylaşmadı." + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(problem)s - %(contest)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "Pazartesi" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "Salı" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "Perşembe " + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "Cuma" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "Durum" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "Pazar" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "Geçmiş" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "Tüm çözümler" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "çözüm testi" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "" +#| "\n" +#| " You have %(left)s submission left\n" +#| " " +#| msgid_plural "" +#| "\n" +#| " You have %(left)s submissions left\n" +#| " " +msgid "Contests written" +msgstr "" +"\n" +"Geriye %(left)s çözümün kaldı" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "Değişkenlik:" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "En düşük derece:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "En yüksek derece:" @@ -4807,6 +5148,24 @@ msgstr "Yönetici Profili" msgid "Check all" msgstr "Tümünü seç" +#, fuzzy +#~| msgid "%(counter)s submission left" +#~| msgid_plural "%(counter)s submissions left" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "%(counter)s gönderi kaldı" +#~ msgstr[1] "%(counter)s gönderi kaldı" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "Yönetici" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "Seçili çözümleri yeniden puanla" + #, fuzzy #~| msgid "%(points)s / %(total)s" #~ msgid "Point %(point)s / Case #%(case)s" diff --git a/locale/tr/LC_MESSAGES/djangojs.po b/locale/tr/LC_MESSAGES/djangojs.po index 387b0b4..c38421e 100644 --- a/locale/tr/LC_MESSAGES/djangojs.po +++ b/locale/tr/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:06\n" "Last-Translator: Icyene\n" "Language-Team: Turkish\n" @@ -27,4 +27,3 @@ msgstr[1] "%d gün, %h:%m:%s" 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 index 53e2cf7..4c41292 100644 --- a/locale/vi/LC_MESSAGES/django.po +++ b/locale/vi/LC_MESSAGES/django.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: lqdojvn\n" +"Project-Id-Version: lqdoj2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-12-30 09:25+0700\n" -"PO-Revision-Date: 2020-06-30 16:38\n" +"POT-Creation-Date: 2021-12-29 13:13+0700\n" +"PO-Revision-Date: 2021-07-20 03:44\n" "Last-Translator: Icyene\n" "Language-Team: Vietnamese\n" "Language: vi_VN\n" @@ -12,99 +12,103 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.com\n" -"X-Crowdin-Project: lqdojvn\n" +"X-Crowdin-Project: lqdoj2\n" "X-Crowdin-Language: vi\n" "X-Crowdin-File: django.po\n" -"X-Crowdin-Project-ID: 408954\n" -"X-Crowdin-File-ID: 2\n" +"X-Crowdin-Project-ID: 466004\n" +"X-Crowdin-File-ID: 5\n" -#: chat_box/models.py:15 judge/admin/interface.py:110 -#: judge/models/contest.py:268 judge/models/contest.py:392 -#: judge/models/profile.py:208 +#: chat_box/models.py:23 chat_box/models.py:41 chat_box/models.py:47 +#: judge/admin/interface.py:110 judge/models/contest.py:403 +#: judge/models/contest.py:528 judge/models/profile.py:215 msgid "user" msgstr "người dùng" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:24 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "thời gian đăng" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:25 judge/models/comment.py:47 msgid "body of comment" -msgstr "bình luận" +msgstr "nội dung bình luận" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/models.py:43 +msgid "last seen" +msgstr "xem lần cuối" + +#: chat_box/views.py:29 templates/chat/chat.html:4 templates/chat/chat.html:541 msgid "Chat Box" -msgstr "Khu Trò Chuyện" - -#: dmoj/settings.py:352 -msgid "German" -msgstr "Tiếng Đức" - -#: dmoj/settings.py:353 -msgid "English" -msgstr "Tiếng Anh" - -#: dmoj/settings.py:354 -msgid "Spanish" -msgstr "Tiếng Tây Ban Nha" - -#: dmoj/settings.py:355 -msgid "French" -msgstr "Tiếng Pháp" - -#: dmoj/settings.py:356 -msgid "Croatian" -msgstr "Tiếng Croatia" - -#: dmoj/settings.py:357 -msgid "Hungarian" -msgstr "Tiếng Hung-ga-ri" +msgstr "Chat Box" #: dmoj/settings.py:358 -msgid "Japanese" -msgstr "Tiếng Nhật Bản" +msgid "German" +msgstr "" #: dmoj/settings.py:359 -msgid "Korean" -msgstr "Tiếng Hàn Quốc" +msgid "English" +msgstr "" #: dmoj/settings.py:360 -msgid "Brazilian Portuguese" -msgstr "Tiếng Braxin-Bồ Đào Nha" +msgid "Spanish" +msgstr "" #: dmoj/settings.py:361 -msgid "Romanian" -msgstr "Tiếng Romania" +msgid "French" +msgstr "" #: dmoj/settings.py:362 -msgid "Russian" -msgstr "Tiếng Nga" +msgid "Croatian" +msgstr "" #: dmoj/settings.py:363 -msgid "Serbian (Latin)" -msgstr "Tiếng Séc-bi (Latin)" +msgid "Hungarian" +msgstr "" #: dmoj/settings.py:364 -msgid "Turkish" -msgstr "Tiếng Thổ Nhĩ Kỳ" +msgid "Japanese" +msgstr "" #: dmoj/settings.py:365 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:366 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:367 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:368 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:369 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:370 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:371 msgid "Vietnamese" msgstr "Tiếng Việt" -#: dmoj/settings.py:366 +#: dmoj/settings.py:372 msgid "Simplified Chinese" -msgstr "Tiếng Trung (Giản thể)" +msgstr "" -#: dmoj/settings.py:367 +#: dmoj/settings.py:373 msgid "Traditional Chinese" -msgstr "Tiếng Trung Truyền Thống" +msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "Đăng nhập" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:207 msgid "Home" msgstr "Trang chủ" @@ -112,7 +116,7 @@ msgstr "Trang chủ" #, python-format msgid "%d comment successfully hidden." msgid_plural "%d comments successfully hidden." -msgstr[0] "%d bình luận đã được ẩn." +msgstr[0] "Đã ẩn %d bình luận." #: judge/admin/comments.py:43 msgid "Hide comments" @@ -122,7 +126,7 @@ msgstr "Ẩn bình luận" #, 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." +msgstr[0] "Không ẩn được %d bình luận." #: judge/admin/comments.py:50 msgid "Unhide comments" @@ -130,94 +134,96 @@ msgstr "Hiện bình luận" #: judge/admin/comments.py:58 msgid "Associated page" -msgstr "Trang liên quan" +msgstr "Trang liên kết" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" -msgstr "Các cuộc thi" +msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" -msgstr "Đề bài" +msgstr "Bài tập" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "Cài đặt" -#: judge/admin/contest.py:117 +#: judge/admin/contest.py:121 msgid "Scheduling" -msgstr "Kế hoạch" +msgstr "" -#: judge/admin/contest.py:118 templates/organization/home.html:57 +#: judge/admin/contest.py:122 templates/organization/home.html:100 msgid "Details" msgstr "Chi tiết" -#: judge/admin/contest.py:119 +#: judge/admin/contest.py:123 msgid "Format" -msgstr "Định dạng" +msgstr "Thể thức" -#: judge/admin/contest.py:120 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" -msgstr "Rating" +msgstr "" -#: judge/admin/contest.py:121 +#: judge/admin/contest.py:125 msgid "Access" msgstr "Truy cập" -#: judge/admin/contest.py:123 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" -msgstr "Luật" +msgstr "Xử phạt" -#: judge/admin/contest.py:200 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." -msgstr[0] "%d kỳ thi đã được hiển thị." +msgstr[0] "%d kỳ thi đã được đánh dấu hiển thị." -#: judge/admin/contest.py:203 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" -msgstr "Hiển thị các kỳ thị" +msgstr "Đánh dấu hiển thị các kỳ thi" -#: judge/admin/contest.py:209 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." -msgstr[0] "%d kỳ thi đã được ẩn." +msgstr[0] "%d kỳ thi đã được đánh dấu ẩn." -#: judge/admin/contest.py:212 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" -msgstr "Ẩn kỳ thi" +msgstr "Ẩn các kỳ thi" -#: judge/admin/contest.py:226 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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." +msgstr[0] "%d bài nộp đã được lên lịch thành công để chấm lại." -#: judge/admin/contest.py:300 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." -msgstr[0] "%d số người tham gia đã được tính lại." +msgstr[0] "%d thí sinh đã được tính điểm lại." -#: judge/admin/contest.py:303 +#: judge/admin/contest.py:311 msgid "Recalculate results" -msgstr "Kết quả tính lại" +msgstr "Tính toán lại kết quả" -#: judge/admin/contest.py:307 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" -msgstr "người dùng" +msgstr "tên đăng nhập" -#: judge/admin/contest.py:312 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:294 msgid "virtual" -msgstr "thử" +msgstr "ảo" #: judge/admin/interface.py:28 judge/models/interface.py:46 msgid "link path" -msgstr "đường dẫn liên kết" +msgstr "đường dẫn" #: judge/admin/interface.py:65 msgid "Content" @@ -225,32 +231,33 @@ msgstr "Nội dung" #: judge/admin/interface.py:66 msgid "Summary" -msgstr "Tóm tắt" +msgstr "Tổng kết" #: judge/admin/interface.py:151 msgid "object" -msgstr "đối tượng" +msgstr "" #: judge/admin/organization.py:34 judge/admin/problem.py:171 #: judge/admin/profile.py:80 msgid "View on site" -msgstr "Xem trên trang web" +msgstr "Xem trên trang" #: judge/admin/problem.py:28 msgid "Describe the changes you made (optional)" -msgstr "Mô tả những thay đổi đã thực hiện (tùy chọn)" +msgstr "Mô tả các thay đổi (tùy chọn)" #: judge/admin/problem.py:126 msgid "Social Media" -msgstr "Mạng xã hội" +msgstr "Mạng Xã Hội" #: judge/admin/problem.py:127 msgid "Taxonomy" -msgstr "Phân loại" +msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:469 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "Điểm" @@ -270,27 +277,27 @@ msgstr "Lịch sử" #: judge/admin/problem.py:168 msgid "Authors" -msgstr "Tác giả" +msgstr "Các 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 public." +msgstr[0] "%d bài tập đã được đánh dấu công khai." #: judge/admin/problem.py:187 msgid "Mark problems as public" -msgstr "Public đề bài" +msgstr "Công khai bài tập" #: 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 unpublic." +msgstr[0] "%d bài tập đã được đánh dấu riêng tư." #: judge/admin/problem.py:197 msgid "Mark problems as private" -msgstr "Unpublic đề bài" +msgstr "Đánh dấu các bài tập là riêng tư" #: judge/admin/profile.py:34 msgid "timezone" @@ -302,15 +309,16 @@ msgstr "múi giờ" #: templates/organization/requests/pending.html:12 #: templates/ticket/list.html:263 msgid "User" -msgstr "Người dùng" +msgstr "Thành viên" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" #: judge/admin/profile.py:96 judge/views/register.py:29 #: templates/registration/registration_form.html:173 -#: templates/user/edit-profile.html:106 +#: templates/user/edit-profile.html:114 msgid "Timezone" msgstr "Múi giờ" @@ -322,23 +330,23 @@ msgstr "ngày tham gia" #, 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." +msgstr[0] "%d người dùng đã được tính điểm lại." #: judge/admin/profile.py:111 msgid "Recalculate scores" -msgstr "Tính lại điểm" +msgstr "Tính điểm lại" #: judge/admin/runtime.py:19 msgid "Disallowed problems" -msgstr "Bài tập không được cho phép" +msgstr "Các bài tập không được cho phép" #: judge/admin/runtime.py:22 msgid "These problems are NOT allowed to be submitted in this language" -msgstr "Bài tập không hỗ trợ ngôn ngữ này" +msgstr "Các bài này không cho phép sử dụng ngôn ngữ này" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" -msgstr "Miêu tả" +msgstr "Mô tả" #: judge/admin/runtime.py:84 msgid "Information" @@ -351,19 +359,19 @@ msgstr "Khả năng" #: judge/admin/submission.py:23 judge/admin/submission.py:42 #: judge/admin/submission.py:221 msgid "None" -msgstr "Không" +msgstr "None" #: judge/admin/submission.py:23 msgid "Not done" -msgstr "Chưa hoàn thành" +msgstr "Chưa xong" #: judge/admin/submission.py:23 msgid "Exceptional" -msgstr "Lỗi" +msgstr "Đặc biệt" #: judge/admin/submission.py:42 msgid "Unaccepted" -msgstr "Không chấp nhận" +msgstr "" #: judge/admin/submission.py:89 #, python-format @@ -377,26 +385,26 @@ msgstr "Bạn không có quyền chấm lại bài." #: judge/admin/submission.py:155 msgid "You do not have the permission to rejudge THAT many submissions." -msgstr "Bạn không có quyền chấm lại QUÁ NHIỀU bài nộp." +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:167 msgid "Rejudge the selected submissions" -msgstr "Chấm lại các bài đã chọn" +msgstr "Chấm lại các bài nộp đã chọn" #: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, 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." +msgstr[0] "%d bài nộp đã đượ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" +msgstr "Tính điểm lại cái bài nộp" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" -msgstr "Mã bài tập" +msgstr "Mã bài" #: judge/admin/submission.py:205 msgid "Problem name" @@ -405,8 +413,9 @@ msgstr "Tên bài" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "Thời gian" @@ -418,48 +427,48 @@ msgstr "%d KB" #: judge/admin/submission.py:225 #, python-format msgid "%.2f MB" -msgstr "%.2f MB" +msgstr "" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "Bộ nhớ" #: judge/admin/taxon.py:11 judge/admin/taxon.py:34 msgid "Included problems" -msgstr "Các bài tập" +msgstr "" #: judge/admin/taxon.py:14 msgid "These problems are included in this group of problems" -msgstr "Các bài tập này đã được bao gồm trong nhóm bài" +msgstr "Các bài tập trong nhóm này" #: 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" +msgstr "Các bài tập dạng này" #: judge/apps.py:8 msgid "Online Judge" -msgstr "Online Judge" +msgstr "" #: judge/comments.py:60 msgid "Comment body" -msgstr "Bình luận" +msgstr "Nội dung bình luận" #: judge/comments.py:66 judge/views/ticket.py:63 msgid "Your part is silent, little toad." -msgstr "Bạn đã bị câm lặng." +msgstr "Bạn không được phép bình luận." #: judge/comments.py:69 templates/comments/list.html:132 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 bình luận." +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:113 +#: judge/comments.py:115 msgid "Posted comment" -msgstr "Đăng bình luận" +msgstr "Bình luận đã đăng" #: judge/contest_format/atcoder.py:19 msgid "AtCoder" -msgstr "AtCoder" +msgstr "" #: judge/contest_format/default.py:18 msgid "Default" @@ -467,61 +476,65 @@ msgstr "Mặc định" #: judge/contest_format/ecoo.py:19 msgid "ECOO" -msgstr "ECOO" +msgstr "" + +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" #: judge/contest_format/ioi.py:19 msgid "IOI" -msgstr "IOI" +msgstr "" #: judge/forms.py:27 msgid "Subscribe to contest updates" -msgstr "Đăng ký để nhận cập nhật về các cuộc thi" +msgstr "Đăng ký để nhận thông báo về các kỳ thi" #: judge/forms.py:28 msgid "Enable experimental features" -msgstr "Bật các tính năng đang thử nghiệm" +msgstr "Sử dụng các tính năng thử nghiệm" -#: judge/forms.py:57 judge/views/organization.py:166 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, 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." +msgstr "Bạn không thể tham gia nhiều hơn {count} tổ chức công khai." #: judge/forms.py:82 -#, fuzzy -#| msgid "judge" msgid "Any judge" -msgstr "máy chấm" +msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" -msgstr "Tên truy cập" +msgstr "Tên đăng nhập" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Mật khẩu" #: judge/forms.py:135 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." +msgstr "Two Factor Authentication phải chứa 6 chữ số." #: judge/forms.py:144 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ệ." +msgstr "Token Two Factor Authentication không hợp lệ." #: judge/forms.py:148 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] + $" +msgstr "Mã bài phải có dạng ^[a-z0-9]+$" #: judge/forms.py:153 msgid "Problem with code already exists." -msgstr "Mã bài tập đã tồn tại." +msgstr "Mã bài đã tồn tại." -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" -msgstr "Id cuộc thi phải bao gồm ^[a-z0-9] + $" +msgstr "Mã kỳ thi phải có dạng ^[a-z0-9]+$" #: judge/forms.py:163 msgid "Contest with key already exists." @@ -530,41 +543,41 @@ msgstr "Mã kỳ thi đã tồn tại." #: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" -msgstr "N j, Y, g:i a" +msgstr "g:i a j b, Y" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/blog/content.html:13 #, python-brace-format msgid "on {time}" -msgstr "vào lúc {time}" +msgstr "vào {time}" #: judge/models/choices.py:59 msgid "Leave as LaTeX" -msgstr "Giữ nguyên dạng LaTeX" +msgstr "Để định dạng LaTeX" #: judge/models/choices.py:60 msgid "SVG with PNG fallback" -msgstr "SVG với PNG dự phòng" +msgstr "" #: judge/models/choices.py:61 msgid "MathML only" -msgstr "Chỉ dùng dạng MathML" +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" +msgstr "" #: judge/models/choices.py:63 msgid "Detect best quality" -msgstr "Tự chọn chất lượng tốt nhất" +msgstr "" #: judge/models/comment.py:26 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+$" +msgstr "Mã trang phải có dạng ^[pcs]:[a-z0-9]+$|^b:\\d+$" #: judge/models/comment.py:42 msgid "commenter" @@ -572,11 +585,11 @@ msgstr "người bình luận" #: judge/models/comment.py:44 judge/models/comment.py:177 msgid "associated page" -msgstr "trang liên kết" +msgstr "trang tương ứng" #: judge/models/comment.py:46 msgid "votes" -msgstr "đánh giá" +msgstr "" #: judge/models/comment.py:48 msgid "hide the comment" @@ -584,7 +597,7 @@ msgstr "ẩn bình luận" #: judge/models/comment.py:49 msgid "parent" -msgstr "bình luận cha" +msgstr "" #: judge/models/comment.py:54 judge/models/comment.py:192 msgid "comment" @@ -592,36 +605,43 @@ msgstr "bình luận" #: judge/models/comment.py:55 msgid "comments" -msgstr "các bình luận" +msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" -msgstr "Đáp án cho %s" +msgstr "" #: judge/models/comment.py:172 msgid "comment vote" -msgstr "đánh giá bình luận" +msgstr "" #: judge/models/comment.py:173 msgid "comment votes" -msgstr "đánh giá bình luận" +msgstr "" #: judge/models/comment.py:182 msgid "Override comment lock" -msgstr "Ghi đè khóa nhận xét" +msgstr "" #: judge/models/comment.py:190 +#: 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" +msgstr "" #: judge/models/comment.py:193 judge/models/message.py:16 msgid "read" -msgstr "đọc" +msgstr "" #: judge/models/comment.py:194 +#: 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" +msgstr "" #: judge/models/comment.py:195 msgid "html link to comments, used for non-comments" @@ -631,470 +651,502 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." -msgstr "Màu sắc không hợp lệ." - -#: judge/models/contest.py:24 -msgid "tag name" -msgstr "tên thẻ" +msgstr "" #: judge/models/contest.py:25 -msgid "Lowercase letters and hyphens only." -msgstr "Chỉ bao gồm chữ thường và dấu gạch ngang." +msgid "tag name" +msgstr "" #: judge/models/contest.py:26 -msgid "tag colour" -msgstr "màu thẻ" +msgid "Lowercase letters and hyphens only." +msgstr "" #: judge/models/contest.py:27 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:28 msgid "tag description" -msgstr "mô tả thẻ" +msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" -msgstr "thẻ kỳ thi" +msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:104 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" -msgstr "thẻ kỳ thi" +msgstr "nhãn kỳ thi" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "Hiển thị" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "Ẩn trong thời gian kỳ thi" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "Ẩn trong thời gian tham gia" + +#: judge/models/contest.py:60 msgid "contest id" -msgstr "id kỳ thi" +msgstr "ID kỳ thi" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "tên kỳ thi" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." -msgstr "Những người này sẽ có thể chỉnh sửa kỳ thi." +#: judge/models/contest.py:63 +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:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +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:68 +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:71 judge/models/runtime.py:136 +#: 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:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" -msgstr "đề bài" +msgstr "bài tập" -#: judge/models/contest.py:58 judge/models/contest.py:269 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "thời gian bắt đầu" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "thời gian kết thúc" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "giới hạn thời gian" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" -msgstr "công khai" +msgstr "hiển thị công khai" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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 kỳ thi riêng, chỉ các thành viên trong nhóm " -"mới thấy được kỳ thi này." +"Đánh dấu ngay cả với các kỳ thi riêng tư của tổ chức, 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:65 +#: judge/models/contest.py:80 msgid "contest rated" -msgstr "kỳ thi có tính rating" +msgstr "kỳ thi được xếp hạng" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." -msgstr "Liệu kỳ thi có được tính rating." - -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "ẩn bảng điểm" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "Liệu bảng điểm có được ẩn trong thời gian thi." - -#: judge/models/contest.py:71 -#, fuzzy -#| msgid "hide scoreboard" -msgid "view contest scoreboard" -msgstr "ẩn bảng điểm" - -#: judge/models/contest.py:73 -#, fuzzy -#| msgid "" -#| "These users will be able to view the private problem, but not edit it." -msgid "These users will be able to view the scoreboard." -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/contest.py:74 -msgid "no comments" -msgstr "không có bình luận" - -#: judge/models/contest.py:75 -msgid "Use clarification system instead of comments." -msgstr "Dùng hệ thống hỏi đáp thay vì bình luận." - -#: judge/models/contest.py:77 -msgid "Rating floor for contest" -msgstr "Rating thấp nhất được tham gia kỳ thi" - -#: judge/models/contest.py:79 -msgid "Rating ceiling for contest" -msgstr "Rating cao nhất được tham gia kỳ thi" - -#: judge/models/contest.py:81 -msgid "rate all" -msgstr "tính rating cho tất cả" - -#: judge/models/contest.py:81 -msgid "Rate all users who joined." -msgstr "Tính rating cho tất cả thí sinh." +msgstr "Quyết định kỳ thi có được xếp hạng không." #: judge/models/contest.py:82 -msgid "exclude from ratings" -msgstr "không tính rating" +msgid "scoreboard visibility" +msgstr "khả năng hiển thị của bảng điểm" -#: judge/models/contest.py:84 -msgid "private to specific users" -msgstr "chỉ riêng tư cho các thành viên cụ thể" +#: judge/models/contest.py:83 +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:85 -msgid "private contestants" -msgstr "thí sinh thi riêng" +msgid "view contest scoreboard" +msgstr "xem bảng điểm kỳ thi" -#: judge/models/contest.py:86 -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 có thể xem kỳ thi" +#: judge/models/contest.py:87 +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:88 -msgid "hide problem tags" -msgstr "ẩn thẻ bài tập" +msgid "no comments" +msgstr "không bình luận" #: judge/models/contest.py:89 -msgid "Whether problem tags should be hidden by default." -msgstr "Các thẻ bài tập có được ẩn mặc định?" +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:91 -msgid "run pretests only" -msgstr "chỉ chạy pretest" +msgid "Rating floor for contest" +msgstr "Cận dưới rating được xếp hạng trong kỳ thi" -#: judge/models/contest.py:92 +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "Cận trên rating được xếp hạng trong kỳ thi" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "xếp hạng tất cả" + +#: judge/models/contest.py:95 +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:96 +msgid "exclude from ratings" +msgstr "không xếp hạng" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "riêng tư với các người dùng này" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "thí sinh riêng tư" + +#: judge/models/contest.py:100 +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:102 +msgid "hide problem tags" +msgstr "ẩn nhãn kỳ thi" + +#: judge/models/contest.py:103 +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:105 +msgid "run pretests only" +msgstr "chỉ chạy pretests" + +#: judge/models/contest.py:106 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 pretest. Chọn trong lúc thi, sau đó bỏ chọn để chấm lại ở cuối cuộc " -"thi." +"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:96 judge/models/interface.py:77 +#: judge/models/contest.py:110 judge/models/interface.py:77 #: judge/models/problem.py:157 msgid "private to organizations" -msgstr "dành riêng cho nhóm" +msgstr "riêng tư với các tổ chức" -#: judge/models/contest.py:97 judge/models/interface.py:75 +#: judge/models/contest.py:111 judge/models/interface.py:75 #: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" -msgstr "nhóm" +msgstr "tổ chức" -#: judge/models/contest.py:98 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" -msgstr "Nếu là riêng tư, chỉ các nhóm này mới có thể thấy kỳ thi" +msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được kỳ thi" -#: judge/models/contest.py:99 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" -msgstr "Ảnh OpenGraph" +msgstr "Hình ảnh OpenGraph" -#: judge/models/contest.py:100 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" -msgstr "Ghi đè logo" +msgstr "Hình ảnh ghi đè logo" -#: judge/models/contest.py:102 +#: judge/models/contest.py:116 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 trong kỳ thi." +msgstr "Ảnh này sẽ thay thế cho logo mặc định trong kỳ thi." -#: judge/models/contest.py:105 +#: judge/models/contest.py:119 msgid "the amount of live participants" -msgstr "số lượng người tham gia" +msgstr "số lượng thí sinh thi trực tiếp" -#: judge/models/contest.py:106 +#: judge/models/contest.py:120 msgid "contest summary" -msgstr "tổng kết cuộc thi" +msgstr "tổng kết kỳ thi" -#: judge/models/contest.py:107 judge/models/problem.py:147 +#: judge/models/contest.py:121 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, hiển thị trong thẻ meta, ví dụ như cho mạng xã hội." +msgstr "" -#: judge/models/contest.py:108 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" -msgstr "mã truy cập" +msgstr "mật khẩu truy cập" -#: judge/models/contest.py:109 +#: judge/models/contest.py:123 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." -msgstr "Mật khẩu để cho phép tham gia kỳ thi. Để trống nếu không dùng." +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:111 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" -msgstr "cá nhân - không tính điểm" +msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:126 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." +msgstr "Cấm những người dùng được chọn tham gia kỳ thi." -#: judge/models/contest.py:113 +#: judge/models/contest.py:127 msgid "contest format" -msgstr "định dạng kỳ thi" +msgstr "format kỳ thi" -#: judge/models/contest.py:114 +#: judge/models/contest.py:128 msgid "The contest format module to use." -msgstr "Loại kỳ thi." +msgstr "" -#: judge/models/contest.py:115 +#: judge/models/contest.py:129 msgid "contest format configuration" -msgstr "cấu hình format kỳ thi" +msgstr "" -#: judge/models/contest.py:116 +#: judge/models/contest.py:130 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 "" -"File JSON để cấu hình loại 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:119 -#, fuzzy -#| msgid "test case points" +#: judge/models/contest.py:137 msgid "precision points" -msgstr "điểm cho testcase" +msgstr "" -#: judge/models/contest.py:121 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:383 msgid "See private contests" -msgstr "Xem các kỳ thi riêng tư" +msgstr "" -#: judge/models/contest.py:250 +#: judge/models/contest.py:384 msgid "Edit own contests" -msgstr "Sửa các kỳ thi của bạn" +msgstr "" -#: judge/models/contest.py:251 +#: judge/models/contest.py:385 msgid "Edit all contests" -msgstr "Chỉnh sửa tất cả các kỳ thi" +msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:386 msgid "Clone contest" -msgstr "Nhân bản kỳ thi" +msgstr "" -#: judge/models/contest.py:253 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" -msgstr "Kỳ thi dùng MOSS" +msgstr "" -#: judge/models/contest.py:254 +#: judge/models/contest.py:388 msgid "Rate contests" -msgstr "Đánh gia các kỳ thi" +msgstr "" -#: judge/models/contest.py:255 +#: judge/models/contest.py:389 msgid "Contest access codes" -msgstr "Mã truy cập kỳ thi" +msgstr "" -#: judge/models/contest.py:256 +#: judge/models/contest.py:390 msgid "Create private contests" -msgstr "Tạo kỳ thi riêng tư" +msgstr "" -#: judge/models/contest.py:257 -#, fuzzy -#| msgid "Mark contests as visible" +#: judge/models/contest.py:391 msgid "Change contest visibility" -msgstr "Hiển thị các kỳ thị" +msgstr "" -#: judge/models/contest.py:259 judge/models/contest.py:356 -#: judge/models/contest.py:393 judge/models/contest.py:416 +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:553 #: judge/models/submission.py:84 msgid "contest" msgstr "kỳ thi" -#: judge/models/contest.py:260 +#: judge/models/contest.py:395 msgid "contests" msgstr "kỳ thi" -#: judge/models/contest.py:267 +#: judge/models/contest.py:402 msgid "associated contest" -msgstr "kỳ thi liên quan" +msgstr "" -#: judge/models/contest.py:270 +#: judge/models/contest.py:405 msgid "score" msgstr "điểm" -#: judge/models/contest.py:271 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "tổng thời gian" -#: judge/models/contest.py:272 +#: judge/models/contest.py:407 msgid "is disqualified" -msgstr "bị loại" +msgstr "đã bị loại" -#: judge/models/contest.py:273 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." -msgstr "Thí sinh này bị loại." +msgstr "Quyết định thí sinh có bị loại không." -#: judge/models/contest.py:274 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" -msgstr "mã số tham gia thử" +msgstr "id lần tham gia ảo" -#: judge/models/contest.py:275 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." -msgstr "0 = thi ảo, còn lại là lần thi thứ n." +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:276 +#: judge/models/contest.py:412 msgid "contest format specific data" -msgstr "định dạng dữ liệu cụ thể của kỳ thi" +msgstr "" -#: judge/models/contest.py:342 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" -msgstr "%s quan sát trong %s" +msgstr "%s đang theo dõi trong %s" -#: judge/models/contest.py:344 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s trong %s, v%d" -#: judge/models/contest.py:345 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s trong %s" -#: judge/models/contest.py:348 +#: judge/models/contest.py:484 msgid "contest participation" -msgstr "thí sinh" +msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:349 +#: judge/models/contest.py:485 msgid "contest participations" -msgstr "thí sinh" +msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:355 judge/models/contest.py:377 -#: judge/models/contest.py:417 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:554 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "bài tập" -#: judge/models/contest.py:357 judge/models/contest.py:381 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "điểm" -#: judge/models/contest.py:358 +#: judge/models/contest.py:494 msgid "partial" msgstr "thành phần" -#: judge/models/contest.py:359 judge/models/contest.py:382 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" -msgstr "là pretest" +msgstr "dùng pretest" -#: judge/models/contest.py:360 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "thứ tự" -#: judge/models/contest.py:361 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" -msgstr "0 để ẩn test đối với thí sinh, 1 để hiện" +msgstr "0 để ẩn test, 1 để hiện" -#: judge/models/contest.py:362 +#: judge/models/contest.py:498 msgid "visible testcases" -msgstr "hiển thị tests" +msgstr "hiển thị test" -#: judge/models/contest.py:363 +#: judge/models/contest.py:499 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." +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:365 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" -msgstr "Tại sao lại có một bài mà bạn không thể nộp?" +msgstr "" -#: judge/models/contest.py:370 +#: judge/models/contest.py:506 msgid "contest problem" -msgstr "đề bài kỳ thi" +msgstr "bài trong kỳ thi" -#: judge/models/contest.py:371 +#: judge/models/contest.py:507 msgid "contest problems" -msgstr "đề bài kỳ thi" +msgstr "bài trong kỳ thi" -#: judge/models/contest.py:375 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "bài nộp" -#: judge/models/contest.py:379 judge/models/contest.py:394 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" -msgstr "tham gia" +msgstr "lần tham gia" -#: judge/models/contest.py:383 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." -msgstr "Bài nộp này chỉ chạy với pretest." +msgstr "Quyết định bài nộp chỉ được chạy trên pretest không." -#: judge/models/contest.py:387 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:388 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:396 +#: judge/models/contest.py:532 msgid "rank" -msgstr "xếp hạng" +msgstr "rank" -#: judge/models/contest.py:397 +#: judge/models/contest.py:533 msgid "rating" msgstr "rating" -#: judge/models/contest.py:398 -msgid "volatility" -msgstr "biến động" +#: judge/models/contest.py:534 +msgid "raw rating" +msgstr "rating thật" -#: judge/models/contest.py:399 +#: judge/models/contest.py:535 +msgid "contest performance" +msgstr "" + +#: judge/models/contest.py:536 msgid "last rated" -msgstr "lần thi cuối" +msgstr "lần cuối được xếp hạng" -#: judge/models/contest.py:403 +#: judge/models/contest.py:540 msgid "contest rating" msgstr "rating kỳ thi" -#: judge/models/contest.py:404 +#: judge/models/contest.py:541 msgid "contest ratings" msgstr "rating kỳ thi" -#: judge/models/contest.py:424 +#: judge/models/contest.py:561 msgid "contest moss result" -msgstr "kết quả kỳ thi moss" +msgstr "kết quả MOSS kỳ thi" -#: judge/models/contest.py:425 +#: judge/models/contest.py:562 msgid "contest moss results" -msgstr "kết quả kỳ thi moss" +msgstr "kết quả MOSS kỳ thi" #: judge/models/interface.py:24 msgid "configuration item" -msgstr "cấu hình" +msgstr "" #: judge/models/interface.py:25 msgid "miscellaneous configuration" -msgstr "cấu hình khác" +msgstr "" #: judge/models/interface.py:37 msgid "navigation item" @@ -1106,7 +1158,7 @@ msgstr "thanh điều hướng" #: judge/models/interface.py:44 msgid "identifier" -msgstr "định danh" +msgstr "" #: judge/models/interface.py:45 msgid "label" @@ -1114,7 +1166,7 @@ msgstr "nhãn" #: judge/models/interface.py:47 msgid "highlight regex" -msgstr "regex" +msgstr "" #: judge/models/interface.py:48 msgid "parent item" @@ -1122,27 +1174,27 @@ msgstr "mục cha" #: judge/models/interface.py:66 msgid "post title" -msgstr "tiêu đề bài viết" +msgstr "tiêu đề bài đăng" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "tác giả" #: judge/models/interface.py:68 msgid "slug" -msgstr "" +msgstr "slug" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" -msgstr "hiển thị công khai" +msgstr "khả năng hiển thị công khai" #: judge/models/interface.py:70 msgid "sticky" -msgstr "dán lên đầu trang" +msgstr "nổi lên đầu" #: judge/models/interface.py:71 msgid "publish after" -msgstr "đăng sau" +msgstr "đăng sau khi" #: judge/models/interface.py:72 msgid "post content" @@ -1150,37 +1202,35 @@ msgstr "đăng nội dung" #: judge/models/interface.py:73 msgid "post summary" -msgstr "đăng tóm tắt" +msgstr "đăng tổng kết" #: judge/models/interface.py:74 msgid "openGraph image" -msgstr "ảnh OpenGraph" +msgstr "hình ảnh openGraph" #: judge/models/interface.py:76 -#, fuzzy -#| msgid "If private, only these organizations may see the contest" msgid "If private, only these organizations may see the blog post." -msgstr "Nếu là riêng tư, chỉ các nhóm này mới có thể thấy kỳ thi" +msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được bài đăng." #: judge/models/interface.py:105 msgid "Edit all posts" -msgstr "Chỉnh sửa tất cả bài viết" +msgstr "Chỉnh sửa tất cả bài đăng" #: judge/models/interface.py:107 msgid "blog post" -msgstr "bài đăng blog" +msgstr "bài đăng" #: judge/models/interface.py:108 msgid "blog posts" -msgstr "bài đăng blog" +msgstr "bài đăng" #: judge/models/message.py:11 msgid "message title" -msgstr "tiêu đề thư" +msgstr "tiêu đề tin nhắn" #: judge/models/message.py:12 judge/models/ticket.py:29 msgid "message body" -msgstr "nội dung thư" +msgstr "nội dung tin nhắn" #: judge/models/message.py:13 msgid "sender" @@ -1192,35 +1242,35 @@ msgstr "người nhận" #: judge/models/message.py:15 msgid "message timestamp" -msgstr "thời gian tin nhắn" +msgstr "thời gian gửi" #: judge/models/message.py:20 msgid "messages in the thread" -msgstr "các tin nhắn trong luồng" +msgstr "tin nhắn trong chuỗi" #: judge/models/problem.py:26 msgid "problem category ID" -msgstr "ID loại bài tập" +msgstr "mã của nhóm bài" #: judge/models/problem.py:27 msgid "problem category name" -msgstr "tên loại bài" +msgstr "tên nhóm bài" #: judge/models/problem.py:34 msgid "problem type" -msgstr "loại bài" +msgstr "dạng bài" #: judge/models/problem.py:35 judge/models/problem.py:113 msgid "problem types" -msgstr "loại bài" +msgstr "dạng bài" #: judge/models/problem.py:39 msgid "problem group ID" -msgstr "ID nhóm bài" +msgstr "mã của nhóm bài" #: judge/models/problem.py:40 msgid "problem group name" -msgstr "tên nhóm đề bài" +msgstr "tên nhóm bài" #: judge/models/problem.py:47 judge/models/problem.py:116 msgid "problem group" @@ -1232,388 +1282,377 @@ msgstr "nhóm bài" #: judge/models/problem.py:52 msgid "key" -msgstr "khóa" +msgstr "" #: judge/models/problem.py:54 msgid "link" -msgstr "liên kết" +msgstr "đường dẫn" #: judge/models/problem.py:55 msgid "full name" -msgstr "tên thật" +msgstr "tên đầy đủ" #: judge/models/problem.py:56 judge/models/profile.py:33 #: judge/models/runtime.py:24 msgid "short name" -msgstr "tên viết tắt" +msgstr "tên ngắn" #: judge/models/problem.py:57 msgid "Displayed on pages under this license" -msgstr "Được hiển thị theo giấy phép này" +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" +msgstr "icon" #: judge/models/problem.py:58 msgid "URL to the icon" -msgstr "URL cho biểu tượng" +msgstr "Đường dẫn icon" #: judge/models/problem.py:59 msgid "license text" -msgstr "văn bản cấp phép" +msgstr "văn bản giấy phép" #: judge/models/problem.py:68 msgid "license" -msgstr "giấy phép" +msgstr "" #: judge/models/problem.py:69 msgid "licenses" -msgstr "giấy phép" +msgstr "" #: judge/models/problem.py:96 msgid "problem code" -msgstr "mã bài" +msgstr "" #: 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" +msgstr "" #: judge/models/problem.py:100 msgid "problem name" -msgstr "tên bài tập" +msgstr "" #: 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 tập, được hiển thị trong dánh sách đề bài." +msgstr "" #: judge/models/problem.py:103 msgid "problem body" -msgstr "bài tập" +msgstr "" #: judge/models/problem.py:104 msgid "creators" -msgstr "người tạo" +msgstr "" #: 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 "người đóng góp" +msgstr "" #: 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" +msgstr "" #: 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 "Loại bài tập, được hiển thị trong trang đề bài." +msgstr "" #: judge/models/problem.py:117 msgid "The group of problem, shown under Category in the problem list." -msgstr "Nhóm bài tập, hiển thị trong danh sách bài tập." +msgstr "" #: 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 hỗ trợ." -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" -msgstr "giới hạn bộ nhớ" +msgstr "" #: 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à " -"được tính thành phần." #: judge/models/problem.py:133 msgid "allows partial points" -msgstr "cho phép cho điểm thành phần" +msgstr "" #: judge/models/problem.py:134 msgid "allowed languages" -msgstr "ngôn ngữ cho phép" +msgstr "" #: 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." +msgstr "" #: judge/models/problem.py:137 msgid "manually managed" -msgstr "quản lý thủ công" +msgstr "" #: 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." +msgstr "" #: judge/models/problem.py:139 msgid "date of publishing" -msgstr "ngày xuất bản" +msgstr "" #: 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" +msgstr "" #: 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." +msgstr "" #: 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ố." +msgstr "" #: judge/models/problem.py:146 msgid "problem summary" -msgstr "tổng quan bài tập" +msgstr "" #: judge/models/problem.py:148 msgid "number of users" -msgstr "số thành viên" +msgstr "" #: 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." +msgstr "" #: judge/models/problem.py:150 msgid "solve rate" -msgstr "tỉ lệ giải được" +msgstr "" #: 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." +msgstr "" -#: judge/models/problem.py:358 judge/models/problem.py:376 -#: judge/models/runtime.py:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 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ố" +msgstr "" #: judge/models/problem.py:396 -msgid "editorial content" -msgstr "biên tập kỳ thi" +msgid "translated name" +msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:397 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:401 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:402 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:406 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:407 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:408 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:423 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:424 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:428 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:431 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:433 +msgid "editorial content" +msgstr "nội dung lời giải" + +#: judge/models/problem.py:449 msgid "solution" msgstr "lời giải" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "lời giải" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" -msgstr "Mặc định" +msgstr "Tiêu chuẩn" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "Số thực" -#: judge/models/problem_data.py:26 -msgid "Floats (absolute)" -msgstr "Số thực (tuyệt đối)" - -#: judge/models/problem_data.py:27 -msgid "Floats (relative)" -msgstr "Số thực (tương đối)" - #: judge/models/problem_data.py:28 -msgid "Non-trailing spaces" -msgstr "Dấu cách liền" +msgid "Floats (absolute)" +msgstr "Số thực (chênh lệch tuyệt đối)" #: judge/models/problem_data.py:29 -msgid "Unordered" -msgstr "Không sắp xếp" +msgid "Floats (relative)" +msgstr "Số thực (chênh lệch tương đối)" #: judge/models/problem_data.py:30 -msgid "Byte identical" -msgstr "Byte tương tự" +msgid "Non-trailing spaces" +msgstr "Không cho phép dấu cách cuối dòng" #: judge/models/problem_data.py:31 -msgid "Line-by-line" -msgstr "Dòng với dòng" +msgid "Unordered" +msgstr "Không thứ tự" #: judge/models/problem_data.py:32 -msgid "Custom checker (PY)" -msgstr "Custom checker (PY)" +msgid "Byte identical" +msgstr "Giống từng byte" #: judge/models/problem_data.py:33 -msgid "Custom validator (CPP)" -msgstr "Custom validator (CPP)" +msgid "Line-by-line" +msgstr "Chấm theo dòng (điểm = số dòng đúng)" -#: judge/models/problem_data.py:40 -msgid "data zip file" -msgstr "tập tin dữ liệu nén dạng zip" +#: judge/models/problem_data.py:34 +msgid "Custom checker (PY)" +msgstr "Trình chấm tự viết (Python)" + +#: judge/models/problem_data.py:35 +msgid "Custom validator (CPP)" +msgstr "Trình chấm tự viết (C++)" #: judge/models/problem_data.py:42 +msgid "data zip file" +msgstr "file zip chứa test" + +#: judge/models/problem_data.py:44 msgid "generator file" -msgstr "file tạo mã" +msgstr "file tạo test" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" -msgstr "độ dài prefix" +msgstr "độ dài hiển thị output" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" -msgstr "hạn chế chiều dài đầu ra" +msgstr "giới hạn hiển thị output" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" -msgstr "phải hồi init.yml" +msgstr "phản hồi của quá trình tạo file init.yml" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" -msgstr "kiểm tra" +msgstr "trình chấm" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" -msgstr "đối số kiểm tra" +msgstr "các biến trong trình chấm" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" -msgstr "kiểm tra đối số như là một đối tượng JSON" +msgstr "các biến trong trình chấm theo dạng JSON" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" -msgstr "custom checker file" +msgstr "file trình chấm" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" -msgstr "custom validator file" - -#: judge/models/problem_data.py:97 -msgid "problem data set" -msgstr "tập dữ liệu đề bài" - -#: judge/models/problem_data.py:99 -msgid "case position" -msgstr "vị trí phép thử" - -#: judge/models/problem_data.py:100 -msgid "case type" -msgstr "kiểu phép thử" - -#: judge/models/problem_data.py:101 -msgid "Normal case" -msgstr "Test đơn" - -#: judge/models/problem_data.py:102 -msgid "Batch start" -msgstr "Bắt đầu lô" - -#: judge/models/problem_data.py:103 -msgid "Batch end" -msgstr "Hết lô" - -#: judge/models/problem_data.py:105 -msgid "input file name" -msgstr "tên tập tin đầu vào" - -#: judge/models/problem_data.py:106 -msgid "output file name" -msgstr "tên tập tin đầu ra" - -#: judge/models/problem_data.py:107 -msgid "generator arguments" -msgstr "bộ sinh đối số" +msgstr "file trình chấm" #: judge/models/problem_data.py:108 -msgid "point value" -msgstr "giá trị điểm" +msgid "problem data set" +msgstr "tập hợp dữ liệu bài" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:110 +msgid "case position" +msgstr "vị trí test" + +#: judge/models/problem_data.py:111 +msgid "case type" +msgstr "loại test" + +#: judge/models/problem_data.py:112 +msgid "Normal case" +msgstr "Test bình thường" + +#: judge/models/problem_data.py:113 +msgid "Batch start" +msgstr "Bắt đầu nhóm" + +#: judge/models/problem_data.py:114 +msgid "Batch end" +msgstr "Kết thúc nhóm" + +#: judge/models/problem_data.py:116 +msgid "input file name" +msgstr "tên file input" + +#: judge/models/problem_data.py:117 +msgid "output file name" +msgstr "tên file output" + +#: judge/models/problem_data.py:118 +msgid "generator arguments" +msgstr "biến trong file sinh test" + +#: judge/models/problem_data.py:119 +msgid "point value" +msgstr "điểm" + +#: judge/models/problem_data.py:120 msgid "case is pretest?" -msgstr "test mẫu?" +msgstr "test là pretest?" #: judge/models/profile.py:30 msgid "organization title" -msgstr "tiêu đề của tổ chức" +msgstr "tiêu đề tổ chức" #: judge/models/profile.py:31 msgid "organization slug" -msgstr "" +msgstr "tên ngắn tổ chức" #: judge/models/profile.py:32 msgid "Organization name shown in URL" -msgstr "Tên tổ chức thể hiện trong URL" +msgstr "Tên được hiển thị trong đường dẫn" #: judge/models/profile.py:34 msgid "Displayed beside user name during contests" -msgstr "Hiển thị bên cạnh tên trong cuộc thi" +msgstr "Hiển thị bên cạnh tên người dùng trong kỳ thi" #: judge/models/profile.py:35 msgid "organization description" @@ -1621,15 +1660,15 @@ msgstr "mô tả tổ chức" #: judge/models/profile.py:36 msgid "registrant" -msgstr "người đăng ký" +msgstr "người tạo" #: judge/models/profile.py:37 msgid "User who registered this organization" -msgstr "Người dùng đã đăng ký tổ chức này" +msgstr "Người tạo tổ chức" #: judge/models/profile.py:38 msgid "administrators" -msgstr "quản trị viên" +msgstr "người quản lý" #: judge/models/profile.py:39 msgid "Those who can edit this organization" @@ -1641,7 +1680,7 @@ msgstr "ngày tạo" #: judge/models/profile.py:41 msgid "is open organization?" -msgstr "là tổ chức mở?" +msgstr "tổ chức mở?" #: judge/models/profile.py:42 msgid "Allow joining organization" @@ -1649,114 +1688,112 @@ msgstr "Cho phép tham gia tổ chức" #: judge/models/profile.py:43 msgid "maximum size" -msgstr "dung lượng tối đa" +msgstr "số lượng thành viên tối đa" #: judge/models/profile.py:44 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" +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:46 msgid "Student access code" -msgstr "Mã truy cập sinh viên" +msgstr "Mã truy cập cho học sinh" #: judge/models/profile.py:50 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." +msgstr "Ảnh này sẽ thay thế logo mặc định khi ở trong tổ chức." #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:216 msgid "organization" -msgstr "tổ chức" +msgstr "" #: judge/models/profile.py:81 msgid "user associated" -msgstr "liên kết với người sử dụng" +msgstr "" #: judge/models/profile.py:82 msgid "self-description" -msgstr "tự mô tả" +msgstr "" #: judge/models/profile.py:83 msgid "location" -msgstr "vị trí" +msgstr "" #: judge/models/profile.py:85 msgid "preferred language" -msgstr "ngôn ngữ" +msgstr "" #: judge/models/profile.py:91 msgid "last access time" -msgstr "lần truy cập cuối cùng" +msgstr "" #: judge/models/profile.py:92 msgid "last IP" -msgstr "IP" +msgstr "" #: judge/models/profile.py:95 msgid "display rank" -msgstr "hiển thị xếp hạng" +msgstr "" #: judge/models/profile.py:97 msgid "comment mute" -msgstr "bình luận tắt" +msgstr "" #: judge/models/profile.py:97 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." +msgstr "" #: judge/models/profile.py:99 msgid "unlisted user" -msgstr "thành viên không được liệt kê" +msgstr "" #: judge/models/profile.py:99 msgid "User will not be ranked." -msgstr "Thành viên không được xếp hạng." +msgstr "" #: judge/models/profile.py:102 msgid "user script" -msgstr "script tự định nghĩa" +msgstr "" #: judge/models/profile.py:103 msgid "User-defined JavaScript for site customization." -msgstr "JavaScript tự định nghĩa để tùy chỉnh trang web" +msgstr "" #: judge/models/profile.py:104 msgid "current contest" -msgstr "cuộc thi hiện tại" +msgstr "kỳ thi hiện tại" #: judge/models/profile.py:106 msgid "math engine" -msgstr "bộ xử lý toán học" +msgstr "" #: judge/models/profile.py:108 msgid "the rendering engine used to render math" -msgstr "công cụ được sử dụng để render toán học" +msgstr "" #: judge/models/profile.py:109 msgid "2FA enabled" -msgstr "2FA có hiệu lực" +msgstr "" #: judge/models/profile.py:110 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" +msgstr "đánh dấu để sử dụng TOTP-based two factor authentication" #: judge/models/profile.py:111 msgid "TOTP key" -msgstr "Mã TOTP" +msgstr "mã TOTP" #: judge/models/profile.py:112 msgid "32 character base32-encoded key for TOTP" -msgstr "mã 32 ký tự base32-encoded cho TOTP" +msgstr "" #: judge/models/profile.py:114 msgid "TOTP key must be empty or base32" -msgstr "Mã TOTP cần rỗng hoặc base32" +msgstr "" #: judge/models/profile.py:115 msgid "internal notes" @@ -1764,44 +1801,44 @@ msgstr "ghi chú nội bộ" #: judge/models/profile.py:116 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." +msgstr "Ghi chú riêng cho quản trị viên." -#: judge/models/profile.py:203 +#: judge/models/profile.py:210 msgid "user profile" -msgstr "hồ sơ người dùng" - -#: judge/models/profile.py:204 -msgid "user profiles" -msgstr "hồ sơ người dùng" +msgstr "thông tin người dùng" #: judge/models/profile.py:211 -msgid "request time" -msgstr "thời gian yêu cầu" +msgid "user profiles" +msgstr "thông tin người dùng" -#: judge/models/profile.py:212 +#: judge/models/profile.py:218 +msgid "request time" +msgstr "thời gian đăng ký" + +#: judge/models/profile.py:219 msgid "state" msgstr "trạng thái" -#: judge/models/profile.py:217 +#: judge/models/profile.py:224 msgid "reason" msgstr "lý do" -#: judge/models/profile.py:220 +#: judge/models/profile.py:227 msgid "organization join request" -msgstr "yêu cầu tham gia tổ chức" +msgstr "đơn đăng ký tham gia" -#: judge/models/profile.py:221 +#: judge/models/profile.py:228 msgid "organization join requests" -msgstr "yêu cầu tham gia tổ chức" +msgstr "đơn đăng ký tham gia" #: judge/models/runtime.py:19 msgid "short identifier" -msgstr "nhận dạng ngắn" +msgstr "tên ngắn" #: judge/models/runtime.py:20 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." +msgstr "" #: judge/models/runtime.py:22 msgid "long name" @@ -1809,71 +1846,63 @@ msgstr "tên dài" #: judge/models/runtime.py:23 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\"." +msgstr "Tên dài, ví dụ \"Python 2\" or \"C++11\"." #: judge/models/runtime.py:25 msgid "" "More readable, but short, name to display publicly; e.g. \"PY2\" or \"C+" "+11\". If left blank, it will default to the short identifier." msgstr "" -"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:29 msgid "common name" -msgstr "tên chung" +msgstr "" #: judge/models/runtime.py:30 msgid "" "Common name for the language. For example, the common name for C++03, C++11, " "and C++14 would be \"C++\"" msgstr "" -"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:32 msgid "ace mode name" -msgstr "chế độ tên ace" +msgstr "" #: judge/models/runtime.py:33 msgid "" "Language ID for Ace.js editor highlighting, appended to \"mode-\" to " "determine the Ace JavaScript file to use, e.g., \"python\"." msgstr "" -"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:35 msgid "pygments name" -msgstr "tên pygments" +msgstr "" #: judge/models/runtime.py:36 msgid "Language ID for Pygments highlighting in source windows." -msgstr "Highligh ID cho Pygments trong cửa sổ mã nguồn." +msgstr "" #: judge/models/runtime.py:37 msgid "code template" -msgstr "code mẫu" +msgstr "" #: judge/models/runtime.py:38 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." +msgstr "" #: judge/models/runtime.py:39 msgid "runtime info override" -msgstr "ghi đè thời gian chạy" +msgstr "" #: judge/models/runtime.py:40 msgid "" "Do not set this unless you know what you're doing! It will override the " "usually more specific, judge-provided runtime info!" msgstr "" -"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:42 msgid "language description" -msgstr "mô tả ngôn ngữ" +msgstr "" #: judge/models/runtime.py:43 msgid "" @@ -1883,140 +1912,140 @@ msgstr "" #: judge/models/runtime.py:45 msgid "extension" -msgstr "phần mở rộng" +msgstr "" #: judge/models/runtime.py:46 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\"." +msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "ngôn ngữ" -#: judge/models/runtime.py:113 -msgid "language to which this runtime belongs" -msgstr "ngôn ngữ tạo ra runtime" - -#: judge/models/runtime.py:114 -msgid "judge on which this runtime exists" -msgstr "máy chấm tạo ra runtime" - -#: judge/models/runtime.py:115 -msgid "runtime name" -msgstr "tên runtime" - #: judge/models/runtime.py:116 -msgid "runtime version" -msgstr "phiên bản runtime" +msgid "language to which this runtime belongs" +msgstr "" #: judge/models/runtime.py:117 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:118 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:119 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" -msgstr "thứ tự hiện thị runtime" - -#: judge/models/runtime.py:121 -msgid "Server name, hostname-style" -msgstr "Tên server, tên host" - -#: judge/models/runtime.py:122 -msgid "time of creation" -msgstr "thời gian tạo" - -#: judge/models/runtime.py:123 -msgid "A key to authenticate this judge" msgstr "" #: judge/models/runtime.py:124 +msgid "Server name, hostname-style" +msgstr "Tên web" + +#: judge/models/runtime.py:125 +msgid "time of creation" +msgstr "ngày tạo" + +#: judge/models/runtime.py:126 +msgid "A key to authenticate this judge" +msgstr "Chìa khóa xác thực" + +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "mã xác thực" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" -msgstr "khóa trình chấm" +msgstr "chặn máy chấm" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." -msgstr "" - -#: judge/models/runtime.py:128 -msgid "judge online status" -msgstr "trạng thái bộ chấm online" - -#: judge/models/runtime.py:129 -msgid "judge start time" -msgstr "thời gian bắt đầu chấm" - -#: judge/models/runtime.py:130 -msgid "response time" -msgstr "thời gian đáp ứng" +msgstr "Quyết định có chặn máy chấm, ngay cả khi mã xác thực đúng." #: judge/models/runtime.py:131 -msgid "system load" -msgstr "mức tải của hệ thống" +msgid "judge online status" +msgstr "trạng thái online của máy chấm" #: judge/models/runtime.py:132 +msgid "judge start time" +msgstr "thời gian khởi đầu máy chấm" + +#: judge/models/runtime.py:133 +msgid "response time" +msgstr "thời gian trả lời" + +#: judge/models/runtime.py:134 +msgid "system load" +msgstr "lưu lượng xử lý" + +#: judge/models/runtime.py:135 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ý." +msgstr "Lưu lượng được chia đều." -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" -msgstr "chấm điểm" +msgstr "máy chấm" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "máy chấm" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" -msgstr "Chấp nhận (AC)" +msgstr "Accepted" #: judge/models/submission.py:21 judge/models/submission.py:48 msgid "Wrong Answer" -msgstr "Kết quả sai (WA)" +msgstr "Wrong Answer" #: judge/models/submission.py:22 judge/models/submission.py:50 msgid "Time Limit Exceeded" -msgstr "Quá thời gian (TLE)" +msgstr "Time Limit Exceeded" #: judge/models/submission.py:23 judge/models/submission.py:51 msgid "Memory Limit Exceeded" -msgstr "Tràn bộ nhớ (MLE)" +msgstr "Memory Limit Exceeded" #: 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" +msgstr "Output Limit Exceeded" #: judge/models/submission.py:25 judge/models/submission.py:53 msgid "Invalid Return" -msgstr "Lỗi khi chạy chương trình (IR)" +msgstr "Invalid Return" #: judge/models/submission.py:26 judge/models/submission.py:54 msgid "Runtime Error" -msgstr "Lỗi Runtime" +msgstr "Runtime Error" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" -msgstr "Lỗi dịch (CE)" +msgstr "Compile Error" #: judge/models/submission.py:28 judge/models/submission.py:40 msgid "Internal Error" -msgstr "Lỗi Nội Bộ" +msgstr "Internal Error" #: judge/models/submission.py:29 msgid "Short circuit" -msgstr "Ngắn mạch" +msgstr "Short circuit" #: judge/models/submission.py:30 judge/models/submission.py:42 #: judge/models/submission.py:61 msgid "Aborted" -msgstr "Bị hủy bỏ" +msgstr "Đã hủy" #: judge/models/submission.py:36 judge/models/submission.py:57 msgid "Queued" -msgstr "Đang chờ" +msgstr "Trong hàng đợi" #: judge/models/submission.py:37 judge/models/submission.py:58 msgid "Processing" @@ -2024,23 +2053,23 @@ msgstr "Đang xử lý" #: judge/models/submission.py:38 judge/models/submission.py:59 msgid "Grading" -msgstr "Chấm điểm" +msgstr "Đang chấm" #: judge/models/submission.py:39 judge/models/submission.py:60 msgid "Completed" -msgstr "Đã Hoàn Thành" +msgstr "Chấm xong" #: 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)" +msgstr "Lỗi máy chấm" #: judge/models/submission.py:66 msgid "submission time" -msgstr "ngày nộp bài" +msgstr "thời gian bài nộp" #: judge/models/submission.py:67 judge/models/submission.py:203 msgid "execution time" -msgstr "thời gian thực hiện tối đa" +msgstr "thời gian chạy" #: judge/models/submission.py:68 judge/models/submission.py:204 msgid "memory usage" @@ -2048,11 +2077,11 @@ msgstr "bộ nhớ sử dụng" #: judge/models/submission.py:69 judge/models/submission.py:205 msgid "points granted" -msgstr "điểm được cho" +msgstr "điểm" #: judge/models/submission.py:70 msgid "submission language" -msgstr "ngôn ngữ lập trình" +msgstr "ngôn ngữ bài nộp" #: judge/models/submission.py:71 msgid "status" @@ -2064,7 +2093,7 @@ msgstr "kết quả" #: judge/models/submission.py:74 msgid "compile errors" -msgstr "lỗi dịch" +msgstr "biên dịch lỗi" #: judge/models/submission.py:76 msgid "batched cases" @@ -2072,21 +2101,19 @@ msgstr "nhóm test" #: judge/models/submission.py:77 msgid "test case points" -msgstr "điểm cho testcase" +msgstr "điểm test" #: judge/models/submission.py:78 msgid "test case total points" -msgstr "tổng điểm test case" +msgstr "tổng điểm các test" #: judge/models/submission.py:79 msgid "judged on" -msgstr "đánh giá trên" +msgstr "chấm trên" #: judge/models/submission.py:81 -#, fuzzy -#| msgid "submission time" msgid "submission judge time" -msgstr "ngày nộp bài" +msgstr "thời điểm được chấm" #: judge/models/submission.py:82 msgid "was rejudged by admin" @@ -2094,15 +2121,15 @@ msgstr "được chấm lại bởi admin" #: judge/models/submission.py:83 msgid "was ran on pretests only" -msgstr "chỉ được chạy bởi test sơ bộ" +msgstr "chỉ chấm pretest" #: judge/models/submission.py:184 templates/contest/moss.html:58 msgid "submissions" -msgstr "nộp bài" +msgstr "bài nộp" #: judge/models/submission.py:188 judge/models/submission.py:199 msgid "associated submission" -msgstr "bài nộp liên quan" +msgstr "bài nộp tương ứng" #: judge/models/submission.py:190 msgid "source code" @@ -2110,55 +2137,55 @@ msgstr "mã nguồn" #: judge/models/submission.py:201 msgid "test case ID" -msgstr "mã testcase" +msgstr "test case ID" #: judge/models/submission.py:202 msgid "status flag" -msgstr "cờ trạng thái" +msgstr "" #: judge/models/submission.py:206 msgid "points possible" -msgstr "khả năng điểm" +msgstr "" #: judge/models/submission.py:207 msgid "batch number" -msgstr "lô số" +msgstr "số thứ tự của nhóm" #: judge/models/submission.py:208 msgid "judging feedback" -msgstr "phản hồi chấm thi" +msgstr "phản hồi từ máy chấm" #: judge/models/submission.py:209 msgid "extended judging feedback" -msgstr "" +msgstr "phản hồi thêm từ máy chấm" #: judge/models/submission.py:210 msgid "program output" -msgstr "lập trình đầu ra" +msgstr "output chương trình" #: judge/models/submission.py:218 msgid "submission test case" -msgstr "test case của bài" +msgstr "cái testcase trong bài nộp" #: judge/models/submission.py:219 msgid "submission test cases" -msgstr "các test case của bài" +msgstr "cái testcase trong bài nộp" #: judge/models/ticket.py:10 msgid "ticket title" -msgstr "" +msgstr "tiêu đề báo cáo" #: judge/models/ticket.py:11 msgid "ticket creator" -msgstr "" +msgstr "người báo cáo" #: judge/models/ticket.py:13 msgid "creation time" -msgstr "" +msgstr "thời gian tạo" #: judge/models/ticket.py:14 msgid "assignees" -msgstr "" +msgstr "người được ủy thác" #: judge/models/ticket.py:15 msgid "quick notes" @@ -2190,22 +2217,25 @@ msgstr "" #: judge/models/ticket.py:30 msgid "message time" -msgstr "thời gian nhắn tin" +msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" -msgstr "Trang [page] /[topage]" +msgstr "" + +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" #: judge/tasks/contest.py:19 -#, fuzzy -#| msgid "Recalculate scores" msgid "Recalculating contest scores" -msgstr "Tính lại điểm" +msgstr "Tính lại điểm kỳ thi" #: judge/tasks/contest.py:40 msgid "Running MOSS" -msgstr "" +msgstr "Đang chạy MOSS" #: judge/tasks/submission.py:43 msgid "Modifying submissions" @@ -2213,68 +2243,68 @@ msgstr "Chỉnh sửa bài nộp" #: judge/tasks/submission.py:56 msgid "Recalculating user points" -msgstr "Đang chấm lại điểm cho người dùng" +msgstr "Tính lại điểm người dùng" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." -msgstr "Lệnh theo lô trống là không được phép." +msgstr "Nhóm test trống là không hợp lệ." -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" -msgstr "" +msgstr "How did you corrupt the custom checker path?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, 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." +msgstr "Ô điểm số cho test #%d phải được điền." -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, 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" +msgstr "File input cho test %d không tồn tại: %s" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, 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" +msgstr "File output cho test %d không tồn tại: %s" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." -msgstr "Phép thử theo lô #%d yêu cầu điểm." +msgstr "Nhóm test #%d cần được điền điểm số." -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, 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" +msgstr "Nhóm test #%d kết thúc không hợp lệ" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" -msgstr "Bạn đã làm hỏng đường dẫn zip?" +msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" -msgstr "Bạn đã làm hỏng đường dẫn đến chương trình sinh?" +msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "Sai" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "Quá thời gian" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "Lỗi" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" -msgstr "Không thể bỏ qua cả bộ lọc queryset và keyword" +msgstr "" #: judge/utils/pwned.py:101 msgid "Your password can't be a commonly used password." -msgstr "Mật khẩu của bạn không thể được sử dụng quá phổ biến" +msgstr "Mật khẩu không được quá phổ biến." #: judge/utils/pwned.py:102 msgid "This password is too common." @@ -2308,168 +2338,178 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/organization/home.html:62 -#: templates/user/user-about.html:47 templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:105 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 +#: templates/user/users-table.html:32 msgid "About" msgstr "Giới thiệu" #: judge/views/about.py:13 msgid "Custom Checker Sample" -msgstr "Hướng dẫn checker" +msgstr "Hướng dẫn viết trình chấm" #: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" -msgstr "Trang %d của bài viết" +msgstr "Trang %d" #: judge/views/comment.py:28 msgid "Messing around, are we?" -msgstr "Bị rối?" +msgstr "Messing around, are we?" #: judge/views/comment.py:37 msgid "You must solve at least one problem before you can vote." -msgstr "Bạn phải giải được ít nhất một bài trước khi có thể bỏ phiếu" +msgstr "Bạn phải giải ít nhất 1 bài trước khi được vote." #: judge/views/comment.py:64 msgid "You already voted." -msgstr "Bạn đã bỏ phiếu rồi." +msgstr "Bạn đã vote." -#: judge/views/comment.py:126 judge/views/organization.py:338 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" -msgstr "Biên tập từ trang web" +msgstr "Chỉnh sửa từ web" #: judge/views/comment.py:147 msgid "Editing comment" -msgstr "Đang chỉnh sửa bình luận" +msgstr "Chỉnh sửa bình luận" -#: judge/views/contests.py:55 judge/views/contests.py:216 -#: judge/views/contests.py:219 judge/views/contests.py:392 +#: judge/views/contests.py:58 judge/views/contests.py:250 +#: judge/views/contests.py:253 judge/views/contests.py:427 msgid "No such contest" -msgstr "Không có cuộc thi như vậy" +msgstr "Không có contest nào như vậy" -#: judge/views/contests.py:56 judge/views/contests.py:217 +#: judge/views/contests.py:59 judge/views/contests.py:251 #, 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\"." +msgstr "Không tìm thấy kỳ thi với mã \"%s\"." -#: judge/views/contests.py:82 +#: judge/views/contests.py:72 msgid "Contests" -msgstr "Cuộc thi" +msgstr "Kỳ thi" -#: judge/views/contests.py:220 +#: judge/views/contests.py:254 msgid "Could not find such contest." -msgstr "Không thể tìm thấy các cuộc thi như vậy." +msgstr "Không tìm thấy kỳ thi nào như vậy." -#: judge/views/contests.py:223 +#: judge/views/contests.py:257 #, python-format msgid "Access to contest \"%s\" denied" -msgstr "Truy cập vào cuộc thi \"%s\" từ chối" +msgstr "Truy cập tới kỳ thi \"%s\" bị từ chối" -#: judge/views/contests.py:247 +#: judge/views/contests.py:281 msgid "Clone Contest" -msgstr "Tạo bản sao cho cuộc thi" +msgstr "Nhân bản kỳ thi" -#: judge/views/contests.py:312 +#: judge/views/contests.py:346 msgid "Contest not ongoing" -msgstr "Cuộc thi không đang diễn ra" +msgstr "Kỳ thi đang không diễn ra" -#: judge/views/contests.py:313 +#: judge/views/contests.py:347 #, python-format msgid "\"%s\" is not currently ongoing." -msgstr "\"%s\" không đang diễn ra." +msgstr "\"%s\" kỳ thi đang không diễn ra." -#: judge/views/contests.py:317 +#: judge/views/contests.py:351 msgid "Already in contest" -msgstr "Đang trong cuộc thi" +msgstr "Đã ở trong kỳ thi" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 #, python-format msgid "You are already in a contest: \"%s\"." -msgstr "Bạn đang ở một cuộc thi: \"%s\"." +msgstr "Bạn đã ở trong kỳ thi: \"%s\"." -#: judge/views/contests.py:321 +#: judge/views/contests.py:355 msgid "Banned from joining" -msgstr "Cấm dự thi" +msgstr "Bị cấm tham gia" -#: judge/views/contests.py:322 +#: judge/views/contests.py:356 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." -msgstr "Tài khoản của bạn đã bị liệt vào danh sách cấm thi trong cuộc thi này" +msgstr "Bạn không được phép tham gia kỳ thi này." -#: judge/views/contests.py:382 +#: judge/views/contests.py:417 #, python-format msgid "Enter access code for \"%s\"" -msgstr "Nhập mã truy cập cho \"%s\"" +msgstr "Nhập mật khẩu truy cập cho \"%s\"" -#: judge/views/contests.py:393 +#: judge/views/contests.py:428 #, python-format msgid "You are not in contest \"%s\"." -msgstr "Bạn đang không tham gia cuộc thi \"%s\"." +msgstr "Bạn không ở trong kỳ thi \"%s\"." -#: judge/views/contests.py:412 +#: judge/views/contests.py:447 msgid "ContestCalendar requires integer year and month" -msgstr "" +msgstr "Lịch thi yêu cầu giá trị cho năm và tháng là số nguyên" -#: judge/views/contests.py:452 +#: judge/views/contests.py:487 #, python-format msgid "Contests in %(month)s" -msgstr "Cuộc thi tại %(month)s" +msgstr "Các kỳ thi trong %(month)s" -#: judge/views/contests.py:452 +#: judge/views/contests.py:487 msgid "F Y" -msgstr "" +msgstr "F Y" -#: judge/views/contests.py:499 +#: judge/views/contests.py:535 #, python-format msgid "%s Statistics" -msgstr "" +msgstr "%s Thống kê" -#: judge/views/contests.py:604 -msgid "???" -msgstr "" - -#: judge/views/contests.py:667 +#: judge/views/contests.py:730 #, python-format msgid "%s Rankings" -msgstr "%s xếp hạng" +msgstr "%s Bảng điểm" -#: judge/views/contests.py:683 +#: judge/views/contests.py:738 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:754 #, python-format msgid "Your participation in %s" -msgstr "Tham gia của bạn vào %s" +msgstr "Lần tham gia trong %s" -#: judge/views/contests.py:684 +#: judge/views/contests.py:755 #, python-format msgid "%s's participation in %s" -msgstr "%s tham gia vào %s" +msgstr "Lần tham gia của %s trong %s" -#: judge/views/contests.py:688 +#: judge/views/contests.py:762 msgid "Live" -msgstr "Trực tuyến" +msgstr "Trực tiếp" -#: judge/views/contests.py:700 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:774 templates/contest/contest-tabs.html:13 msgid "Participation" -msgstr "Tham gia" +msgstr "Lần tham gia" -#: judge/views/contests.py:746 +#: judge/views/contests.py:821 #, python-format msgid "%s MOSS Results" msgstr "%s Kết quả MOSS" -#: judge/views/contests.py:773 +#: judge/views/contests.py:848 #, python-format msgid "Running MOSS for %s..." msgstr "Đang chạy MOSS cho %s..." -#: judge/views/contests.py:796 +#: judge/views/contests.py:871 #, python-format msgid "Contest tag: %s" -msgstr "Thẻ cuộc thi %s" +msgstr "Nhãn kỳ thi: %s" + +#: judge/views/contests.py:881 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "Mô tả vấn đề" + +#: judge/views/contests.py:924 +#, python-format +msgid "New clarification for %s" +msgstr "Thông báo mới cho %s" #: judge/views/error.py:14 msgid "404 error" -msgstr "lỗi 404" +msgstr "Lỗi 404" #: judge/views/error.py:15 #, python-format @@ -2479,236 +2519,247 @@ 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" +msgstr "không có quyền cho %s" #: judge/views/error.py:30 #, python-format msgid "corrupt page %s" -msgstr "trang lỗi %s" +msgstr "trang bị sập %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" +msgstr "Runtimes" #: judge/views/notification.py:40 #, python-format msgid "Notifications (%d unseen)" -msgstr "" +msgstr "Thông báo (%d chưa xem)" -#: judge/views/organization.py:58 judge/views/organization.py:61 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "Không có tổ chức như vậy" -#: judge/views/organization.py:59 +#: judge/views/organization.py:60 #, 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\"." +msgstr "Không tìm thấy tổ chức với mã \"%s\"." -#: judge/views/organization.py:62 +#: judge/views/organization.py:63 msgid "Could not find such organization." -msgstr "Không thể tìm thấy các tổ chức như vậy." +msgstr "" -#: judge/views/organization.py:78 judge/views/register.py:34 -#: templates/organization/list.html:32 templates/user/user-list-tabs.html:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "Tổ chức" -#: judge/views/organization.py:128 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" -msgstr "%s thành viên" +msgstr "%s Thành viên" -#: judge/views/organization.py:157 judge/views/organization.py:160 -#: judge/views/organization.py:165 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" -msgstr "Đang tham gia tổ chức" +msgstr "Tham gia tổ chức" -#: judge/views/organization.py:157 +#: judge/views/organization.py:159 msgid "You are already in the organization." -msgstr "Bạn đã trong tổ chức." +msgstr "Bạn đã ở trong tổ chức." -#: judge/views/organization.py:160 +#: judge/views/organization.py:162 msgid "This organization is not open." -msgstr "Tổ chức này không phải là mở." +msgstr "Tổ chức này không phải tổ chức mở." -#: judge/views/organization.py:177 +#: judge/views/organization.py:179 msgid "Leaving organization" -msgstr "Rời khỏi tổ chức" +msgstr "Rời tổ chức" -#: judge/views/organization.py:177 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." -msgstr "Bạn đang không ở trong \"%s\"." +msgstr "Bạn không ở trong \"%s\"." -#: judge/views/organization.py:201 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" -msgstr "Yêu cầu tham gia %s" +msgstr "Đăng ký tham gia %s" -#: judge/views/organization.py:219 +#: judge/views/organization.py:221 msgid "Join request detail" -msgstr "Chi tiết yêu cầu tham gia" +msgstr "Chi tiết đơn đăng ký" -#: judge/views/organization.py:248 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" -msgstr "Quản lý các yêu cầu tham gia %s" +msgstr "Quản lý đơn đăng ký cho %s" -#: judge/views/organization.py:279 +#: judge/views/organization.py:285 #, 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." +"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:291 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." -msgstr[0] "Chấp nhận %d thành viên." +msgstr[0] "Đã chấp thuận %d người." -#: judge/views/organization.py:292 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." -msgstr[0] "Từ chối %d thành viên." +msgstr[0] "Đã từ chối %d người." -#: judge/views/organization.py:322 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "Đang chỉnh sửa %s" -#: judge/views/organization.py:346 judge/views/organization.py:354 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "Không thể chỉnh sửa tổ chức" -#: judge/views/organization.py:347 +#: judge/views/organization.py:353 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:355 -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:360 judge/views/organization.py:364 -msgid "Can't kick user" -msgstr "Không thể loại thành viên" +msgstr "Bạn không được phép chỉnh sửa tổ chức này." #: judge/views/organization.py:361 -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!" +msgid "You are not allowed to kick people from this organization." +msgstr "Bạn không được phép đuổi người." -#: judge/views/organization.py:365 +#: judge/views/organization.py:366 judge/views/organization.py:370 +msgid "Can't kick user" +msgstr "Không thể đuổi" + +#: judge/views/organization.py:367 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:371 #, 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." +msgstr "" #: judge/views/problem.py:68 msgid "No such problem" -msgstr "Không có vấn đề như vậy" +msgstr "Không có bài nào 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\"." +msgstr "Không tìm thấy bài tập với mã bài \"%s\"." #: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" -msgstr "Hướng giải của {0}" +msgstr "Hướng dẫn cho {0}" #: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" -msgstr "Hướng giải của {0}" +msgstr "Hướng dẫn cho {0}" -#: judge/views/problem.py:286 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:31 +#: judge/views/problem.py:226 +#, python-brace-format +msgid "Disscuss {0}" +msgstr "" + +#: judge/views/problem.py:229 +#, python-brace-format +msgid "Discuss {0}" +msgstr "Thảo luận {0}" + +#: judge/views/problem.py:297 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:29 msgid "Problems" -msgstr "Đề bài" +msgstr "Bài tập" -#: judge/views/problem.py:563 +#: judge/views/problem.py:597 msgid "Banned from submitting" -msgstr "Bạn đã bị chặn không được nộp bài" +msgstr "Bị cấm nộp bài" -#: judge/views/problem.py:564 +#: judge/views/problem.py:598 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." +msgstr "Bạn đã bị cấm nộp bài này." -#: judge/views/problem.py:578 +#: judge/views/problem.py:612 msgid "Too many submissions" -msgstr "Quá nhiều bài nộp" +msgstr "Quá nhiều lần nộp" -#: judge/views/problem.py:579 +#: judge/views/problem.py:613 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." +msgstr "Bạn đã vượt quá số lần nộp cho bài này." -#: judge/views/problem.py:639 judge/views/problem.py:642 +#: judge/views/problem.py:673 judge/views/problem.py:676 #, python-format msgid "Submit to %(problem)s" -msgstr "Nộp lời giải cho %(problem)s" +msgstr "Nộp bài cho %(problem)s" -#: judge/views/problem.py:657 +#: judge/views/problem.py:691 msgid "Clone Problem" msgstr "Nhân bản bài tập" -#: judge/views/problem_data.py:37 +#: judge/views/problem_data.py:48 msgid "Checker arguments must be a JSON object" -msgstr "Đối số kiểm tra phải là đối tượng JSON" +msgstr "" -#: judge/views/problem_data.py:39 +#: judge/views/problem_data.py:50 msgid "Checker arguments is invalid JSON" -msgstr "Đối số kiểm tra là đối tượng JSON không hợp lệ" +msgstr "" -#: judge/views/problem_data.py:46 +#: judge/views/problem_data.py:57 msgid "Your zip file is invalid!" -msgstr "File nén bị lỗi!" +msgstr "File Zip không hợp lệ!" -#: judge/views/problem_data.py:107 +#: judge/views/problem_data.py:120 #, 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:110 +#: judge/views/problem_data.py:123 #, 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:145 +#: judge/views/problem_data.py:158 #, python-brace-format msgid "Editing data for {0}" -msgstr "Sửa dữ liệu cho {0}" +msgstr "Chỉnh sửa dữ liệu cho {0}" -#: judge/views/problem_data.py:148 +#: judge/views/problem_data.py:161 #, python-format msgid "Editing data for %s" -msgstr "Chỉnh sửa các dữ liệu cho %s" +msgstr "Chỉnh sửa dữ liệu cho %s" -#: judge/views/problem_data.py:240 judge/views/problem_data.py:241 +#: judge/views/problem_data.py:253 judge/views/problem_data.py:254 #, python-format msgid "Generated init.yml for %s" -msgstr "Tạo file Init.yml cho %s" +msgstr "File init.yml cho %s" #: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" -msgstr "Quản lí các bài nộp cho %s" +msgstr "Quản lý bài nộp cho %s" #: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." -msgstr "Chấm lại các bài nộp đã chọn cho %s..." +msgstr "Đang chấm lại các bài nộp cho %s..." #: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." -msgstr "Tính lại điểm cho %s..." +msgstr "Đang tính điểm lại các bài nộp cho %s..." #: judge/views/problem_manage.py:150 #, python-format @@ -2719,257 +2770,402 @@ msgstr[0] "Đã lên lịch chấm lại cho %d bài nộp." #: 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" +msgstr "Các bài nộ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}" +msgstr "Các bài nộ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" +msgstr "Các bài nộ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" +msgstr "Các bài nộp tốt nhất cho bài %(number)s trong %(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}" -"" +"Các bài nộ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}" +msgstr "Các bài nộp 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" +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:31 templates/user/edit-profile.html:110 +#: judge/views/register.py:31 templates/user/edit-profile.html:118 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?" +msgstr "Đăng ký để nhận thông báo?" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, 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." +"Email \"%s\" đã được sử dụng. Mỗi email chỉ có thể đăng ký một tài khoản." -#: judge/views/register.py:51 +#: judge/views/register.py:61 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." +"Your email provider is not allowed due to history of abuse. Please use a " +"reputable email provider." -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "Đăng ký" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" -msgstr "Xác thực không thành công" +msgstr "Xác thực thất bại" #: judge/views/stats.py:67 msgid "Language statistics" -msgstr "Thống kê theo ngôn ngữ" +msgstr "Thống kê ngôn ngữ" #: judge/views/status.py:24 templates/submission/list.html:313 msgid "Status" -msgstr "Trạng thái" +msgstr "Kết quả chấm" #: judge/views/status.py:107 msgid "Version matrix" msgstr "Ma trận phiên bản" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" -msgstr "Nộp %(problem)s bởi %(user)s" +msgstr "Bài nộp của %(user)s cho bài %(problem)s" -#: judge/views/submission.py:250 judge/views/submission.py:251 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:165 msgid "All submissions" -msgstr "Tất cả các bài nộp" +msgstr "Tất cả bài nộp" -#: judge/views/submission.py:407 +#: judge/views/submission.py:404 msgid "All my submissions" -msgstr "Tất cả những lần nộp bài của tôi" +msgstr "Tất cả bài nộp của tôi" -#: judge/views/submission.py:408 +#: judge/views/submission.py:405 #, python-format msgid "All submissions by %s" -msgstr "Tất cả các bài nộp bởi %s" +msgstr "Tất cả bài nộp của %s" -#: judge/views/submission.py:439 +#: judge/views/submission.py:436 #, python-format msgid "All submissions for %s" -msgstr "Tất cả các bài nộp bởi %s" +msgstr "Tất cả bài nộp cho %s" -#: judge/views/submission.py:458 +#: judge/views/submission.py:455 msgid "Must pass a problem" -msgstr "Phải giải được 1 bài" +msgstr "Phải làm được một bài" -#: judge/views/submission.py:504 +#: judge/views/submission.py:501 #, python-format msgid "My submissions for %(problem)s" -msgstr "Các bài nộp của tôi cho %(problem)s" +msgstr "Bài nộp của tôi cho %(problem)s" -#: judge/views/submission.py:505 +#: judge/views/submission.py:502 #, python-format msgid "%(user)s's submissions for %(problem)s" -msgstr "bài nộp của %(user)s cho %(problem)s" +msgstr "Các bài nộp của %(user)s cho %(problem)s" -#: judge/views/submission.py:606 +#: judge/views/submission.py:603 msgid "Must pass a contest" -msgstr "Phải vượt qua một cuộc thi" +msgstr "Phải qua một kỳ thi" -#: judge/views/submission.py:625 +#: judge/views/submission.py:622 #, python-brace-format msgid "" "{0}'s submissions for {2} in {4}" msgstr "" -"{0} gửi cho {2} trong {4}" +"Các bài nộp của {0} cho {2} trong {4}" -#: judge/views/submission.py:632 +#: judge/views/submission.py:629 #, python-brace-format msgid "" "{0}'s submissions for problem {2} in {3}" "" msgstr "" +"Các bài nộp của {0} cho bài {2} trong {3}" +"" #: judge/views/ticket.py:50 judge/views/ticket.py:56 msgid "Ticket title" -msgstr "Tiêu đề thẻ" - -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "Mô tả vấn đề" +msgstr "Tiêu đề báo cáo" #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" -msgstr "Thẻ mới cho %s" +msgstr "Báo cáo mới cho %s" #: judge/views/ticket.py:170 #, python-format msgid "%(title)s - Ticket %(id)d" -msgstr "" +msgstr "%(title)s - Báo cáo %(id)d" #: judge/views/ticket.py:279 #, python-format msgid "Tickets - Page %(number)d of %(total)d" -msgstr "" +msgstr "Báo cáo - Trang %(number)d trên %(total)d" #: judge/views/ticket.py:328 #, python-format msgid "New Ticket: %s" -msgstr "" +msgstr "Báo cáo mới: %s" #: judge/views/ticket.py:329 #, python-format msgid "#%(id)d, assigned to: %(users)s" -msgstr "" +msgstr "#%(id)d, được phân cho: %(users)s" #: judge/views/ticket.py:331 msgid ", " -msgstr "" +msgstr ", " #: judge/views/ticket.py:331 msgid "no one" -msgstr "không có ai" +msgstr "không người nào" #: judge/views/ticket.py:351 #, python-format msgid "New Ticket Message For: %s" -msgstr "Thêm thẻ tin nhắn mới cho: %s" +msgstr "Tin nhắn báo cáo mới cho: %s" #: judge/views/totp.py:42 templates/registration/totp_enable.html:86 msgid "Enable Two Factor Authentication" -msgstr "Bật Xác thực Hai Yếu tố" +msgstr "Kích hoạt Two Factor Authentication" #: judge/views/totp.py:89 templates/registration/totp_disable.html:48 msgid "Disable Two Factor Authentication" -msgstr "" +msgstr "Hủy kích hoạt Two Factor Authentication" #: judge/views/totp.py:105 msgid "Perform Two Factor Authentication" -msgstr "" - -#: judge/views/user.py:70 -msgid "No such user" -msgstr "Không có thư mục này" - -#: judge/views/user.py:70 -#, python-format -msgid "No user handle \"%s\"." -msgstr "Không xử lý người dùng \"%s\"." +msgstr "Thực hiện Two Factor Authentication" #: judge/views/user.py:74 +msgid "No such user" +msgstr "Không người dùng nào như vậy" + +#: judge/views/user.py:74 +#, python-format +msgid "No user handle \"%s\"." +msgstr "Không tồn tại tên người dùng \"%s\"." + +#: judge/views/user.py:78 msgid "My account" msgstr "Tài khoản của tôi" -#: judge/views/user.py:75 +#: judge/views/user.py:79 #, python-format msgid "User %s" -msgstr "Người dùng %s" +msgstr "Thành viên %s" -#: judge/views/user.py:140 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "j M, Y" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" -msgstr "" +msgstr "j M, Y, G:i" -#: judge/views/user.py:257 +#: judge/views/user.py:290 msgid "Updated on site" -msgstr "Cập Nhật trên trang web" +msgstr "Được cập nhật trên web" -#: judge/views/user.py:290 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:324 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:255 #: templates/user/user-tabs.html:10 msgid "Edit profile" -msgstr "Chỉnh sửa tiểu sử" +msgstr "Chỉnh sửa thông tin" -#: judge/views/user.py:299 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:333 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "Bảng xếp hạng" +#: judge/views/user.py:408 +msgid "Import Users" +msgstr "" + #: 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" +msgstr "Dữ liệu không hợp lệ: %s" #: judge/views/widgets.py:68 msgid "Bad latitude or longitude" -msgstr "Sai tọa độ" +msgstr "Kinh độ / Vĩ độ không hợp lệ" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +#, fuzzy +#| msgid "short name" +msgid "first name" +msgstr "tên ngắn" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +#, fuzzy +#| msgid "short name" +msgid "last name" +msgstr "tên ngắn" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "tiểu sử" + +#: 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: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 "" + +#: 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 "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 "" + +#: 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 "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 +#, fuzzy +#| msgid "administrators" +msgid "Administration" +msgstr "người quản lý" + +#: 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?" +msgstr "Bạn có muốn chấm lại tất 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á" +msgstr "Rate" #: templates/admin/judge/contest/change_list.html:9 msgid "Rate all ratable contests" -msgstr "Đánh giá các cuộc thi" +msgstr "Rate tất cả kỳ thi xếp hạng" #: templates/admin/judge/judge/change_form.html:15 #: templates/admin/judge/judge/change_form.html:18 @@ -2979,89 +3175,90 @@ 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" +msgstr "Dừng" #: templates/admin/judge/problem/change_form.html:14 msgid "View Submissions" -msgstr "Xem các bài nộp" +msgstr "Xem Bài Nộp" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" -msgstr "Xem các bài nộp" +msgstr "Xem 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" +msgstr "Chỉnh sửa thông tin" #: templates/admin/judge/submission/change_form.html:14 #: templates/admin/judge/submission/change_form.html:17 -#: templates/submission/source.html:34 templates/submission/status.html:67 +#: templates/submission/source.html:38 templates/submission/status.html:67 msgid "Rejudge" msgstr "Chấm lại" -#: templates/base.html:229 +#: templates/base.html:224 templates/chat/chat.html:566 +msgid "Chat" +msgstr "Chat" + +#: templates/base.html:230 +msgid "Notification" +msgstr "Thông báo" + +#: templates/base.html:247 #, python-format msgid "Hello, %(username)s." msgstr "Xin chào, %(username)s." -#: templates/base.html:235 templates/comments/list.html:89 -#: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/base.html:253 templates/chat/chat.html:20 +#: templates/comments/list.html:89 templates/contest/contest-list-tabs.html:24 +#: templates/contest/ranking-table.html:53 #: 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ị" +msgstr "" -#: templates/base.html:244 +#: templates/base.html:262 msgid "Log out" msgstr "Đăng xuất" -#: templates/base.html:253 +#: templates/base.html:271 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "Đăng nhập" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:272 templates/registration/registration_form.html:177 msgid "or" msgstr "hoặc" -#: templates/base.html:255 +#: templates/base.html:273 msgid "Sign up" msgstr "Đăng ký" -#: templates/base.html:270 +#: templates/base.html:288 msgid "spectating" -msgstr "quan sát" +msgstr "đang theo dõi" -#: templates/base.html:283 +#: templates/base.html:301 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." +msgstr "" #: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" -msgstr "Soạn thảo" +msgstr "Chỉnh sửa" #: templates/blog/blog.html:26 #, python-format -msgid "" -"\n" -" posted on %(time)s\n" -" " -msgstr "" -"\n" -" đăng vào lúc %(time)s\n" -" " +msgid " posted on %(time)s" +msgstr "đã đăng vào %(time)s" -#: templates/blog/content.html:10 -#, python-brace-format -msgid "posted on {time}" -msgstr "đã đăng lúc {time}" +#: templates/blog/content.html:13 +msgid "posted" +msgstr "đã đăng" #: templates/blog/dashboard.html:21 #, python-format @@ -3071,107 +3268,162 @@ msgid "" " " msgstr "" "\n" -" vào lúc %(time)s\n" +" vào %(time)s\n" " " -#: templates/blog/list.html:85 +#: templates/blog/list.html:93 msgid "Blog" -msgstr "Nhật kí trực tuyến" +msgstr "" -#: templates/blog/list.html:87 +#: templates/blog/list.html:95 msgid "Events" msgstr "Sự kiện" -#: templates/blog/list.html:92 +#: templates/blog/list.html:100 msgid "News" msgstr "Tin tức" -#: templates/blog/list.html:107 templates/problem/problem.html:310 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:364 msgid "Clarifications" -msgstr "Làm rõ" +msgstr "Thông báo" -#: templates/blog/list.html:123 templates/problem/problem.html:321 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "Thêm mới" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:375 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." +msgstr "Không có thông báo nào." -#: templates/blog/list.html:131 +#: templates/blog/list.html:148 msgid "Ongoing contests" -msgstr "Cuộc thi đang diễn ra" +msgstr "Kỳ thi đang diễn ra" -#: templates/blog/list.html:149 +#: templates/blog/list.html:156 +msgid "Ends in" +msgstr "Còn" + +#: templates/blog/list.html:166 msgid "Upcoming contests" -msgstr "Sự kiện sắp tới" +msgstr "Kỳ thi sắp diễn ra" -#: templates/blog/list.html:167 +#: templates/blog/list.html:184 msgid "My open tickets" -msgstr "Thẻ của tôi" +msgstr "Báo cáo dành cho tôi" -#: templates/blog/list.html:189 +#: templates/blog/list.html:206 msgid "New tickets" -msgstr "Thẻ mới" - -#: templates/blog/list.html:210 -msgid "New problems" -msgstr "Đề bài mới" +msgstr "Báo cáo mới" #: templates/blog/list.html:227 +msgid "New problems" +msgstr "Bài tập mới" + +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "Dòng bình luận" -#: templates/chat/chat.html:234 -msgid "Chat" -msgstr "Chat" +#: templates/chat/chat.html:18 +msgid "Recent" +msgstr "Gần đây" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:19 +msgid "Following" +msgstr "Bạn bè" + +#: templates/chat/chat.html:21 +msgid "Other" +msgstr "Thành viên khác" + +#: templates/chat/chat.html:166 +msgid "New message(s)" +msgstr "Tin nhắn mới" + +#: templates/chat/chat.html:507 templates/chat/chat.html:588 +#: templates/user/base-users.html:14 templates/user/base-users.html:80 +msgid "Search by handle..." +msgstr "Tìm kiếm theo tên..." + +#: templates/chat/chat.html:568 templates/chat/chat.html:575 msgid "Online Users" +msgstr "Trực tuyến" + +#: templates/chat/chat.html:576 +msgid "Refresh" +msgstr "Làm mới" + +#: templates/chat/chat.html:609 +msgid "Emoji" msgstr "" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:610 msgid "Enter your message" -msgstr "Nhập tin nhắn..." +msgstr "Nhập tin nhắn" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "Quản trị viên" +#: templates/chat/message.html:20 templates/fine_uploader/script.html:25 +msgid "Delete" +msgstr "Xóa" -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "Thành viên" +#: templates/chat/message_list.html:7 +msgid "You are connect now. Say something to start the conversation." +msgstr "Các bạn đã kết nối. Nhắn gì đó để bắt đầu cuộc trò chuyện." + +#: templates/chat/online_status.html:6 +#: templates/chat/user_online_status.html:14 +msgid "Lobby" +msgstr "Sảnh chung" + +#: templates/chat/user_online_status.html:19 +#, python-brace-format +msgid "Last online on {time}" +msgstr "Trực tuyến vào {time}" + +#: templates/chat/user_online_status.html:31 +msgid "Unignore" +msgstr "Mở lại thông báo" + +#: templates/chat/user_online_status.html:33 +msgid "Ignore" +msgstr "Tắt thông báo" + +#: templates/chat/user_online_status.html:40 +msgid "users are online" +msgstr "người đang trực tuyến" #: templates/comments/list.html:2 msgid "Comments" -msgstr "Nhận xét" +msgstr "Bình luận" #: 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" +msgstr "Đăng nhập để vote" #: templates/comments/list.html:40 #, python-brace-format msgid "commented on {time}" -msgstr "đã bình luận lúc {time}" +msgstr "bình luận vào {time}" #: templates/comments/list.html:49 #, python-format msgid "edit %(edits)s" -msgstr "sửa %(edits)s" +msgstr "chỉnh sửa %(edits)s" #: templates/comments/list.html:51 templates/comments/media-js.html:92 msgid "edited" -msgstr "chỉnh sửa" +msgstr "đã chỉnh sửa" #: templates/comments/list.html:60 templates/notification/list.html:14 msgid "Link" -msgstr "Liên kết" +msgstr "Link" #: templates/comments/list.html:73 templates/comments/list.html:80 msgid "Reply" -msgstr "Phản hồi" +msgstr "Trả lời" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:282 msgid "Hide" msgstr "Ẩn" @@ -3186,14 +3438,15 @@ msgid "" " " msgstr "" "\n" -"Bình luận bị ẩn do có quá nhiều phản hồi tiêu cực\n" -" Bấm vào đây để hiển thị.\n" +" Bình luận bị ẩn vì có quá " +"nhiều phản hồi tiêu cực.\n" +" Nhấn vào đây để xem.\n" " " #: templates/comments/list.html:121 msgid "There are no comments at the moment." -msgstr "Không có ý kiến tại thời điểm này." +msgstr "Không có bình luận nào." #: templates/comments/list.html:127 msgid "New comment" @@ -3201,7 +3454,7 @@ msgstr "Bình luận mới" #: templates/comments/list.html:141 msgid "Invalid comment body." -msgstr "Bình luận không hợp lệ." +msgstr "Nội dung không hợp lệ." #: templates/comments/list.html:149 msgid "Post!" @@ -3209,13 +3462,11 @@ msgstr "Đăng!" #: templates/comments/list.html:157 msgid "Comments are disabled on this page." -msgstr "Bình luận đã bị vô hiệu hóa trên trang này." +msgstr "Bình luận bị tắt trong trang này." #: templates/comments/media-js.html:38 -#, fuzzy -#| msgid "no comments" msgid "Replying to comment" -msgstr "không có bình luận" +msgstr "Trả lời bình luận" #: templates/comments/media-js.html:87 #, python-brace-format @@ -3224,15 +3475,15 @@ msgstr "chỉnh sửa {edits}" #: templates/comments/media-js.html:90 msgid "original" -msgstr "nguyên bản" +msgstr "original" #: templates/contest/access_code.html:26 msgid "Invalid access code." -msgstr "Mã truy cập không hợp lệ." +msgstr "Mật khẩu 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:" +msgstr "Nhập mật khẩu truy cập:" #: templates/contest/access_code.html:32 msgid "Join Contest" @@ -3244,11 +3495,11 @@ msgstr "Chủ nhật" #: templates/contest/calendar.html:13 msgid "Monday" -msgstr "Thứ Hai" +msgstr "Thứ hai" #: templates/contest/calendar.html:14 msgid "Tuesday" -msgstr "Thứ Ba" +msgstr "Thứ ba" #: templates/contest/calendar.html:15 msgid "Wednesday" @@ -3256,19 +3507,24 @@ msgstr "Thứ tư" #: templates/contest/calendar.html:16 msgid "Thursday" -msgstr "Thứ Năm" +msgstr "Thứ năm" #: templates/contest/calendar.html:17 msgid "Friday" -msgstr "Thứ Sáu" +msgstr "Thứ sáu" #: templates/contest/calendar.html:18 msgid "Saturday" -msgstr "Thứ Bảy" +msgstr "Thứ bảy" + +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "Tạo mới" #: 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:" +msgstr "Nhập mã kỳ thi cho kỳ thi nhân bản:" #: templates/contest/clone.html:40 templates/problem/clone.html:40 msgid "Clone!" @@ -3284,18 +3540,18 @@ msgstr "Hôm nay" #: templates/contest/contest-list-tabs.html:13 msgid "Next" -msgstr "Kế tiếp" +msgstr "Tiếp" #: templates/contest/contest-list-tabs.html:21 #: templates/problem/problem-list-tabs.html:5 msgid "List" -msgstr "" +msgstr "Danh sách" #: templates/contest/contest-list-tabs.html:22 msgid "Calendar" msgstr "Lịch" -#: templates/contest/contest-tabs.html:4 templates/organization/home.html:55 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:98 msgid "Info" msgstr "Thông tin" @@ -3308,55 +3564,84 @@ msgstr "Thống kê" msgid "Rankings" msgstr "Bảng xếp hạng" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" -msgstr "" +msgstr "Bảng xếp hạng ẩn" #: templates/contest/contest-tabs.html:21 msgid "MOSS" -msgstr "" +msgstr "MOSS" #: templates/contest/contest-tabs.html:26 msgid "Clone" -msgstr "" +msgstr "Nhân bản" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" -msgstr "Rời khỏi cuộc thi" +msgstr "Rời kỳ thi" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:394 msgid "Virtual join" msgstr "Tham gia ảo" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "Ngừng theo dõi" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" -msgstr "Theo dõi cuộc thi" +msgstr "Theo dõi kỳ thi" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" -msgstr "Tham gia cuộc thi" +msgstr "Tham gia kỳ thi" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "Đăng nhập để tham gia" +#: templates/contest/contest.html:33 +#, python-format +msgid "Spectating, contest ends in %(countdown)s." +msgstr "Đang theo dõi, kỳ thi còn %(countdown)s." + +#: templates/contest/contest.html:35 +#, python-format +msgid "Participating virtually, %(countdown)s remaining." +msgstr "Đang tham gia ảo, còn %(countdown)s." + #: templates/contest/contest.html:37 msgid "Participating virtually." -msgstr "" +msgstr "Đang tham gia ảo." + +#: templates/contest/contest.html:41 +#, python-format +msgid "Starting in %(countdown)s." +msgstr "Kỳ thi bắt đầu trong %(countdown)s nữa." #: templates/contest/contest.html:43 msgid "Contest is over." -msgstr "Cuộc thi kết thúc." +msgstr "Kỳ thi đã kết thúc." + +#: templates/contest/contest.html:47 +#, python-format +msgid "Your time is up! Contest ends in %(countdown)s." +msgstr "Hết giờ! Kỳ thi kết thúc trong %(countdown)s." + +#: templates/contest/contest.html:49 +#, python-format +msgid "You have %(countdown)s remaining." +msgstr "Bạn còn %(countdown)s." + +#: templates/contest/contest.html:52 +#, python-format +msgid "Contest ends in %(countdown)s." +msgstr "Kỳ thi kết thúc trong %(countdown)s" #: templates/contest/contest.html:59 templates/contest/contest.html:63 msgid "F j, Y, G:i T" -msgstr "" +msgstr "G:i T, j F, Y" #: templates/contest/contest.html:59 #, python-format @@ -3364,191 +3649,261 @@ 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" +"Một thời gian dài %(time_limit)s trong khoản %(start_time)s từ " +"%(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" +msgstr "Kéo dài %(length)s bắt đầu từ %(start_time)s" #: templates/contest/contest.html:85 msgid "AC Rate" msgstr "Tỷ lệ AC" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:291 templates/contest/list.html:371 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "Số lượng" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" -msgstr "Hướng dẫn giải" +msgstr "Hướng dẫn" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 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?" +msgstr "Bạn có chắc tham gia?" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 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." +"Tham gia kỳ thi lần đầu sẽ kích hoạt thời gian đếm ngược, không thể dừng lại " +"sau đó." -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:280 +msgid "Show" +msgstr "Hiển thị" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +msgid "Organizations..." +msgstr "Tổ chức..." + +#: templates/contest/list.html:135 msgid "hidden" -msgstr "" +msgstr "ẩn" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" -msgstr "" +msgstr "riêng tư" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" -msgstr "" +msgstr "rated" -#: templates/contest/list.html:132 +#: templates/contest/list.html:180 +#, python-format +msgid "%(time_limit)s window" +msgstr "Cửa sổ thi dài %(time_limit)s" + +#: templates/contest/list.html:182 +#, python-format +msgid "%(duration)s long" +msgstr "Kéo dài %(duration)s" + +#: templates/contest/list.html:202 msgid "Spectate" -msgstr "Hóng" +msgstr "Theo dõi" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "Tham gia" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "Tìm kiếm kỳ thi..." + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "Tìm kiếm" + +#: templates/contest/list.html:232 msgid "Active Contests" -msgstr "" +msgstr "Kỳ thi bạn đang tham gia" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:290 +#: templates/contest/list.html:329 templates/contest/list.html:368 msgid "Contest" -msgstr "Cuộc thi" +msgstr "Kỳ thi" -#: templates/contest/list.html:190 +#: templates/contest/list.html:254 +#, python-format +msgid "Window ends in %(countdown)s" +msgstr "Cửa số thi còn %(countdown)s" + +#: templates/contest/list.html:257 templates/contest/list.html:306 +#, python-format +msgid "Ends in %(countdown)s" +msgstr "Kết thúc trong %(countdown)s" + +#: templates/contest/list.html:277 msgid "Ongoing Contests" -msgstr "Cuộc thi đang diễn ra" +msgstr "Kỳ thi đang diễn ra" -#: templates/contest/list.html:227 +#: templates/contest/list.html:324 msgid "Upcoming Contests" -msgstr "Sự kiện sắp tới" +msgstr "Kỳ thi sắp tới" -#: templates/contest/list.html:255 +#: templates/contest/list.html:352 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." +msgstr "Không có kỳ thi nào được lên lịch hiện tại." -#: templates/contest/list.html:261 +#: templates/contest/list.html:358 msgid "Past Contests" -msgstr "Cuộc thi đã qua" +msgstr "Kỳ thi trong quá khứ" #: 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?" +msgstr "Bạn có chắc muốn rời?" #: 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." +"Bạn không thể quay lại lần tham gia ảo này. Bạn sẽ phải tham gia ảo lại từ " +"đầu." #: 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." +msgstr "Tham gia kỳ thi sẽ khởi động đồng hồ đếm ngược, và không thể dừng lại." #: templates/contest/moss.html:28 msgid "Are you sure you want MOSS the contest?" -msgstr "" +msgstr "Bạn có chắc muốn MOSS kỳ thi này?" #: templates/contest/moss.html:33 msgid "Are you sure you want to delete the MOSS results?" -msgstr "" +msgstr "Bạn có chắc muốn xóa kết quả MOSS?" #: templates/contest/moss.html:60 msgid "No submissions" -msgstr "" +msgstr "Không có bài nộp" #: templates/contest/moss.html:74 msgid "Re-MOSS contest" -msgstr "" +msgstr "MOSS lại kỳ thi" #: templates/contest/moss.html:82 msgid "Delete MOSS results" -msgstr "" +msgstr "Xóa kết quả MOSS" #: templates/contest/private.html:5 msgid "This contest is private to specific users." -msgstr "" +msgstr "Kỳ thi riêng tư với các thành viên này." #: templates/contest/private.html:10 msgid "Additionally, only the following organizations may access this contest:" -msgstr "" +msgstr "Thêm vào đó, chỉ những tổ chức này mới được tham gia kỳ thi:" #: 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:" +msgstr "Chỉ những tổ chức sau được tham gia kỳ thi:" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "Tổ chức" -#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 -#, fuzzy -#| msgid "full name" +#: templates/contest/ranking-table.html:10 msgid "Full Name" -msgstr "Tên thật" - -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" -msgstr "" +msgstr "Họ tên" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "Khôi phục kết quả" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" -msgstr "" +msgstr "Hủy kết quả" #: templates/contest/ranking.html:187 msgid "Are you sure you want to disqualify this participation?" -msgstr "" +msgstr "Bạn có chắc muốn hủy kết quả này?" #: templates/contest/ranking.html:192 msgid "Are you sure you want to un-disqualify this participation?" -msgstr "" +msgstr "Bạn có chắc muốn khôi phục kết quả này?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:415 msgid "View user participation" -msgstr "Xem thành viên tham gia" +msgstr "Xem các lần tham gia" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:419 msgid "Show organizations" -msgstr "Hiển thị nhóm" +msgstr "Hiển thị tổ chức" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:423 msgid "Show full name" -msgstr "Hiển thị tên thật" +msgstr "Hiển thị họ tên" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:426 msgid "Show friends only" msgstr "Chỉ hiển thị bạn bè" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:429 msgid "Total score only" -msgstr "Chỉ hiện thị tổng điểm" +msgstr "Chỉ hiển thị tổng điểm" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:431 +msgid "Show virtual participation" +msgstr "Hiển thị tham gia ảo" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" +msgstr "Phân bố theo kết quả" + +#: templates/contest/stats.html:56 +msgid "Problem AC Rate" +msgstr "Tỷ lệ AC" + +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "Phân bố điểm" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Số bài nộp theo ngôn ngữ" + +#: templates/contest/stats.html:82 templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "Tỷ lệ AC theo ngôn ngữ" + +#: templates/fine_uploader/script.html:4 +msgid "Drop files here to upload" msgstr "" -#: templates/contest/stats.html:43 -msgid "Problem AC Rate" -msgstr "Tỉ lệ AC" +#: templates/fine_uploader/script.html:7 +msgid "Upload file" +msgstr "Tải file lên" -#: templates/contest/stats.html:48 templates/stats/language.html:16 -msgid "Submissions by Language" -msgstr "Bài nộp theo ngôn ngữ" +#: templates/fine_uploader/script.html:23 +msgid "Cancel" +msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 -msgid "Language AC Rate" -msgstr "Tỉ lệ AC của ngôn ngữ" +#: templates/fine_uploader/script.html:24 +msgid "Retry" +msgstr "" + +#: templates/fine_uploader/script.html:26 +msgid "Pause" +msgstr "" + +#: templates/fine_uploader/script.html:27 +msgid "Continue" +msgstr "Tiếp tục" #: templates/license.html:12 msgid "Source:" @@ -3561,48 +3916,42 @@ msgstr "Nguồn:" #: templates/newsletter/subscription_update_activated.html:3 #: templates/newsletter/subscription_update_activated.html:6 msgid "Newsletter" -msgstr "Bản tin" +msgstr "" #: templates/newsletter/newsletter_list.html:2 #: templates/newsletter/newsletter_list.html:3 -#, fuzzy -#| msgid "Newsletter" msgid "Newsletter list" -msgstr "Bản tin" +msgstr "" #: templates/newsletter/newsletter_list.html:6 msgid "Subscribe to get the latest emails about upcoming contests and events." msgstr "" #: templates/newsletter/newsletter_list.html:16 -#, fuzzy -#| msgid "Unsubscribe" msgid "Subscribe" -msgstr "Hủy đăng ký" +msgstr "" #: templates/newsletter/newsletter_list.html:30 -#, fuzzy -#| msgid "Update subscription" msgid "Update subscriptions" -msgstr "Cập nhật bài nộp của tôi" +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 "hoạt động" +msgstr "" #: templates/newsletter/subscription_unsubscribe_activated.html:8 msgid "You have successfully been unsubscribed." -msgstr "Bạn đã bỏ đăng ký thành công." +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 "Bỏ đăng ký bản tin" +msgstr "" #: templates/newsletter/subscription_unsubscribe_email_sent.html:8 msgid "" @@ -3610,39 +3959,35 @@ msgid "" "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?" +msgstr "" #: templates/newsletter/subscription_unsubscribe_user.html:21 msgid "Unsubscribe" -msgstr "Hủy đăng ký" +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 "Bản tin Cập Nhật" +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 "" -"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" +msgstr "" #: 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." +msgstr "" #: templates/newsletter/subscription_update_email_sent.html:8 msgid "" @@ -3650,119 +3995,101 @@ msgid "" "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/notification/list.html:7 -#, fuzzy -#| msgid "Use desktop notification" msgid "You have no notifications" -msgstr "Sử dụng thông báo trên màn hình" +msgstr "Bạn không có thông báo" #: templates/notification/list.html:13 -#, fuzzy -#| msgid "activate" msgid "Activity" -msgstr "hoạt động" +msgstr "Hoạt động" #: templates/organization/edit.html:46 #: templates/organization/requests/pending.html:34 #: templates/ticket/edit-notes.html:4 msgid "Update" -msgstr "Cập Nhật" +msgstr "Cập nhật" -#: templates/organization/home.html:20 +#: templates/organization/home.html:32 msgid "Are you sure you want to leave this organization?" -msgstr "" +msgstr "Bạn có chắc muốn rời tổ chức?" -#: templates/organization/home.html:22 +#: templates/organization/home.html:34 msgid "You will have to rejoin to show up on the organization leaderboard." -msgstr "" +msgstr "Bạn phải tham gia lại để được hiển thị trong bảng xếp hạng tổ chức." -#: templates/organization/home.html:24 +#: templates/organization/home.html:36 msgid "You will have to request membership in order to join again." -msgstr "" +msgstr "Bạn phải đăng ký thành viên để được tham gia lại." -#: templates/organization/home.html:72 -#, fuzzy -#| msgid "Organizations" -msgid "Organization news" -msgstr "Tổ chức" - -#: templates/organization/home.html:78 -#, fuzzy -#| msgid "There are no scheduled contests at this time." -msgid "There is no news 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/organization/home.html:87 -#, fuzzy -#| msgid "Contest" -msgid "Controls" -msgstr "Cuộc thi" - -#: templates/organization/home.html:93 -msgid "Leave organization" -msgstr "Rời khỏi tổ chức" - -#: templates/organization/home.html:98 +#: templates/organization/home.html:81 msgid "Join organization" msgstr "Tham gia tổ chức" -#: templates/organization/home.html:102 +#: templates/organization/home.html:85 msgid "Request membership" -msgstr "Yêu cầu tư cách thành viên" +msgstr "Đăng ký thành viên" -#: templates/organization/home.html:108 +#: templates/organization/home.html:115 +msgid "Organization news" +msgstr "Tin tức tổ chức" + +#: templates/organization/home.html:121 +msgid "There is no news at this time." +msgstr "Không có tin tức." + +#: templates/organization/home.html:130 +msgid "Controls" +msgstr "Quản lý" + +#: templates/organization/home.html:135 msgid "Edit organization" -msgstr "Chỉnh sửa các tổ chức" +msgstr "Chỉnh sửa tổ chức" -#: templates/organization/home.html:112 +#: templates/organization/home.html:141 msgid "View requests" -msgstr "Xem yêu cầu" +msgstr "Xem các đơn đăng ký" -#: templates/organization/home.html:118 +#: templates/organization/home.html:154 msgid "Admin organization" -msgstr "Tổ chức người quản trị" +msgstr "Trang admin tổ chức" -#: templates/organization/home.html:122 +#: templates/organization/home.html:160 msgid "View members" -msgstr "Xem các thành viên" +msgstr "Xem thành viên" -#: templates/organization/home.html:129 -#, fuzzy -#| msgid "See private contests" +#: templates/organization/home.html:167 +msgid "Leave organization" +msgstr "Rời tổ chức" + +#: templates/organization/home.html:176 msgid "New private contests" -msgstr "Xem các kỳ thi riêng tư" +msgstr "Kỳ thi riêng tư mới" -#: templates/organization/home.html:142 -#, fuzzy -#| msgid "New problems" +#: templates/organization/home.html:186 templates/organization/home.html:201 +msgid "View all" +msgstr "Tất cả" + +#: templates/organization/home.html:192 msgid "New private problems" -msgstr "Đề bài mới" +msgstr "Bài tập riêng tư mới" #: templates/organization/list.html:40 -#, fuzzy -#| msgid "Show organizations" msgid "Show my organizations only" -msgstr "Hiển thị nhóm" +msgstr "Chỉ hiển thị tổ chức của tôi" #: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "Tên" #: templates/organization/list.html:48 msgid "Members" -msgstr "Các thành viên" - -#: templates/organization/new.html:10 templates/ticket/new.html:38 -msgid "Create" -msgstr "Tạo" +msgstr "Thành viên" #: templates/organization/requests/detail.html:13 msgid "User:" -msgstr "Người dùng:" +msgstr "Thành viên:" #: templates/organization/requests/detail.html:17 msgid "Organization:" @@ -3774,7 +4101,7 @@ msgstr "Thời gian:" #: templates/organization/requests/detail.html:29 msgid "Reason:" -msgstr "Lý Do:" +msgstr "Lý do:" #: templates/organization/requests/log.html:11 #: templates/organization/requests/pending.html:14 @@ -3789,76 +4116,76 @@ 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." +msgstr "Không có đơn đăng ký." #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:472 msgid "Delete?" -msgstr "Xoá?" +msgstr "Xóa?" #: templates/organization/requests/request.html:18 msgid "Your reason for joining:" -msgstr "Lý do của bạn để tham gia:" +msgstr "Lý do tham gia:" #: templates/organization/requests/request.html:20 msgid "Request" -msgstr "Yêu cầu" +msgstr "Đăng ký" #: templates/organization/requests/tabs.html:4 msgid "Pending" -msgstr "Đang chờ" +msgstr "Đang chờ duyệt" #: templates/organization/requests/tabs.html:7 msgid "Log" -msgstr "Nhật ký" +msgstr "Ghi chép" #: templates/organization/requests/tabs.html:10 msgid "Approved" -msgstr "Phê duyệt" +msgstr "Chấp thuận" #: templates/organization/requests/tabs.html:13 msgid "Rejected" -msgstr "Bị từ chối" +msgstr "Từ chối" #: templates/organization/users-table.html:15 msgid "Kick" -msgstr "Loại" +msgstr "Đuổi" #: templates/problem/clone.html:37 msgid "Enter a new code for the cloned problem:" -msgstr "" +msgstr "Nhập mã bài mới cho bài tập được nhân bản:" -#: templates/problem/data.html:108 +#: templates/problem/data.html:144 msgid "Instruction" msgstr "Hướng dẫn" -#: templates/problem/data.html:433 +#: templates/problem/data.html:430 msgid "View YAML" msgstr "Xem YAML" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:461 templates/problem/data.html:512 msgid "Apply!" msgstr "Lưu!" -#: templates/problem/data.html:469 +#: templates/problem/data.html:466 msgid "Type" msgstr "Kiểu" -#: templates/problem/data.html:470 +#: templates/problem/data.html:467 msgid "Input file" -msgstr "Tập tin đầu vào" +msgstr "File Input" -#: templates/problem/data.html:471 +#: templates/problem/data.html:468 msgid "Output file" -msgstr "Tập tin đầu ra" +msgstr "File Output" -#: templates/problem/data.html:473 +#: templates/problem/data.html:470 msgid "Pretest?" -msgstr "Thử sơ bộ?" +msgstr "Pretest?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:513 msgid "Add new case" -msgstr "Thêm mới trường hợp" +msgstr "Thêm test mới" #: templates/problem/editorial.html:22 msgid "" @@ -3867,232 +4194,239 @@ msgid "" "editorialist.

Submitting an official solution before solving the " "problem yourself is a bannable offence." msgstr "" -"Tham khảo lời giải này chỉ khi bạn thật sự bế tắc ý tưởng, và đừng " -"bao giờ sao chép code từ đây. Làm ơn tôn trọng tác giả của bài tập cũng như " -"người viết lời giải.

Submit code từ lời giải chính thức trước " -"khi tự mình giải quyết bài toán là một sự xúc phạm nghiêm trọng đối với " -"chúng tôi!" +"Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người " +"viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là " +"hành vi có thể dẫn đến khóa tài khoản." -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." -msgstr "Lọc theo loại..." +msgstr "Lọc theo dạng..." -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" -msgstr "Những bài tập nổi bật" +msgstr "Bài tập mới" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" -msgstr "Thuộc Danh mục" +msgstr "Nhóm" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" -msgstr "Kiểu" +msgstr "Dạng" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "AC %%" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "Thêm thông báo" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" -msgstr "Chừa trống nếu không muốn lọc theo ngôn ngữ" +msgstr "Để trống nếu không lọc theo ngôn ngữ" #: templates/problem/manage_submission.html:60 msgid "Leave empty to not filter by result" -msgstr "Chừa trống nếu không muốn lọc theo kết quả" +msgstr "Để trống nếu không lọc theo kết quả" #: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." -msgstr "" +msgstr "Cần số liệu hợp lệ cho ID bắt đầu và kết thúc." #: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." -msgstr "ID cuối phải đứng sau ID đầu" +msgstr "ID kết thúc phải lớn hơn hoặc bằng ID khởi đầu." #: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" "You are about to {action} {count} submissions. Are you sure you want to do " "this?" -msgstr "" +msgstr "Bạn chuẩn bị {action} {count} bài nộp. Tiếp tục?" #: templates/problem/manage_submission.html:103 #, python-brace-format msgid "" "You are about to {action} a few submissions. Are you sure you want to do " "this?" -msgstr "" +msgstr "Bạn chuẩn bị {action} vài bài nộp. Tiếp tục?" #: templates/problem/manage_submission.html:127 #: templates/submission/list.html:309 msgid "Filter submissions" -msgstr "Lọc các bài nộp" +msgstr "Lọc bài nộp" #: templates/problem/manage_submission.html:132 msgid "Filter by ID:" -msgstr "Lọc bằng ID:" +msgstr "Lọc theo ID:" #: templates/problem/manage_submission.html:135 msgid "Starting ID:" -msgstr "ID đầu:" +msgstr "ID bắt đầu:" #: templates/problem/manage_submission.html:139 msgid "Ending ID:" -msgstr "ID cuối:" +msgstr "ID kết thúc:" #: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." -msgstr "" +msgstr "Bao gồm hai đầu mút." #: templates/problem/manage_submission.html:146 msgid "Filter by language:" -msgstr "Lọc bằng ngôn ngữ:" +msgstr "Lọc theo ngôn ngữ:" #: templates/problem/manage_submission.html:154 msgid "Filter by result:" -msgstr "Lọc bằng kết quả:" +msgstr "Lọc theo kết quả:" #: templates/problem/manage_submission.html:164 -#, fuzzy -#| msgid "location" msgid "Action" -msgstr "vị trí" +msgstr "Hành động" #: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" -msgstr "Chấm lại những bài nộp đã chọn" +msgstr "Chấm lại những bài nộp này" #: templates/problem/manage_submission.html:171 -#, fuzzy -#| msgid "Too many submissions" msgid "Download selected submissions" -msgstr "Quá nhiều bài nộp" +msgstr "Tải các bài nộp này" #: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" -msgstr "" +msgstr "Bạn có chắc muốn tính điểm lại %(count)d bài nộp?" #: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" -msgstr "Chấm lại tất cả bài nộp" +msgstr "Tính điểm lại các bài nộp" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:130 msgid "View as PDF" -msgstr "Xem dạng PDF" +msgstr "Xem PDF" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:139 templates/problem/problem.html:149 +#: templates/problem/problem.html:154 msgid "Submit solution" -msgstr "Gửi bài giải" +msgstr "Nộp bài" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:142 #, 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 +#: templates/problem/problem.html:150 msgid "0 submissions left" msgstr "Còn 0 lần nộp" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:162 msgid "My submissions" -msgstr "Lời giải của tôi" +msgstr "Bài nộp của tôi" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:166 msgid "Best submissions" -msgstr "Lời giải tốt nhất" +msgstr "Các bài nộp tốt nhất" -#: templates/problem/problem.html:132 +#: templates/problem/problem.html:170 +msgid "Discuss" +msgstr "Thảo luận" + +#: templates/problem/problem.html:174 msgid "Read editorial" -msgstr "Đọc hướng dẫn" +msgstr "Xem hướng dẫn" -#: templates/problem/problem.html:137 +#: templates/problem/problem.html:179 msgid "Manage tickets" -msgstr "Quản lý thẻ" +msgstr "Xử lý báo cáo" -#: templates/problem/problem.html:141 +#: templates/problem/problem.html:183 msgid "Edit problem" -msgstr "Sửa đề bài" +msgstr "Chỉnh sửa bài" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:185 msgid "Edit test data" -msgstr "Sửa đổi test" +msgstr "Chỉnh sửa test" -#: templates/problem/problem.html:148 +#: templates/problem/problem.html:190 msgid "My tickets" -msgstr "Thẻ của tôi" +msgstr "Báo cáo của tôi" -#: templates/problem/problem.html:156 +#: templates/problem/problem.html:198 msgid "Manage submissions" msgstr "Quản lý bài nộp" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:204 msgid "Clone problem" -msgstr "Copy sang bài mới" +msgstr "Nhân bản bài" -#: templates/problem/problem.html:169 +#: templates/problem/problem.html:211 msgid "Points:" msgstr "Điểm:" -#: templates/problem/problem.html:172 templates/problem/problem.html:174 +#: templates/problem/problem.html:214 templates/problem/problem.html:216 msgid "(partial)" -msgstr "(một phần)" +msgstr "(thành phần)" -#: templates/problem/problem.html:179 +#: templates/problem/problem.html:221 msgid "Time limit:" -msgstr "Giới hạn thời gian:" +msgstr "Thời gian:" -#: templates/problem/problem.html:191 +#: templates/problem/problem.html:233 msgid "Memory limit:" -msgstr "Giới hạn bộ nhớ:" +msgstr "Bộ nhớ:" -#: templates/problem/problem.html:210 +#: templates/problem/problem.html:252 msgid "Author:" msgid_plural "Authors:" msgstr[0] "Tác giả:" -#: templates/problem/problem.html:225 +#: templates/problem/problem.html:267 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "Dạng bài" -#: templates/problem/problem.html:238 +#: templates/problem/problem.html:280 msgid "Allowed languages" msgstr "Ngôn ngữ cho phép" -#: templates/problem/problem.html:246 +#: templates/problem/problem.html:288 #, 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 "" +msgstr "Không có máy chấm cho %(lang)s" #: templates/problem/problem.html:299 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "Máy chấm:" + +#: templates/problem/problem.html:316 +msgid "none available" +msgstr "không có sẵn" + +#: templates/problem/problem.html:328 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "Bài này có %(length)s thông báo" + +#: templates/problem/problem.html:353 msgid "Request clarification" -msgstr "Gửi thắc mắc" +msgstr "Yêu cầu làm rõ đề" -#: templates/problem/problem.html:301 +#: templates/problem/problem.html:355 msgid "Report an issue" -msgstr "Báo cáo vấn đề" +msgstr "Báo cáo một vấn đề" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" -msgstr "Giới hạn thời gian" +msgstr "Giới hạn thời gian:" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" -msgstr "Giới hạn bộ nhớ" +msgstr "Giới hạn bộ nhớ:" #: templates/problem/search-form.html:2 msgid "Problem search" @@ -4100,49 +4434,49 @@ msgstr "Tìm kiếm bài tập" #: templates/problem/search-form.html:8 msgid "Search problems..." -msgstr "Tìm đề bài..." +msgstr "Tìm bài tập..." #: templates/problem/search-form.html:14 msgid "Full text search" -msgstr "Tìm kiếm" +msgstr "" #: templates/problem/search-form.html:21 msgid "Hide solved problems" -msgstr "Ẩn các bài đã có lời giải" +msgstr "Ẩn các bài đã giải" #: templates/problem/search-form.html:27 msgid "Show problem types" -msgstr "Hiện loại đề" +msgstr "Hiển thị dạng bài" #: templates/problem/search-form.html:32 msgid "Show editorial" msgstr "Hiển thị hướng dẫn" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "Tất cả" -#: templates/problem/search-form.html:51 -msgid "Problem types" -msgstr "Kiểu bài tập" - #: templates/problem/search-form.html:62 -msgid "Point range" -msgstr "Khoảng điểm" +msgid "Problem types" +msgstr "Dạng bài" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:73 +msgid "Point range" +msgstr "Mốc điểm" + +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" -msgstr "Tìm" +msgstr "Lọc" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "Ngẫu nhiên" #: templates/problem/submit.html:117 msgid "Your source code must contain at most 65536 characters." -msgstr "" +msgstr "Code phải chứa không quá 65536 ký tự." #: templates/problem/submit.html:204 #, python-format @@ -4150,6 +4484,8 @@ msgid "" "Warning! Your default language, %(default_language)s, is " "unavailable for this problem and has been deselected." msgstr "" +"Cẩn thận! Ngôn ngữ ưa thích của bạn, %(default_language)s, " +"không được sử dụng trong bài này." #: templates/problem/submit.html:215 #, python-format @@ -4162,14 +4498,17 @@ msgid_plural "" " You have %(left)s submissions left\n" " " msgstr[0] "" +"\n" +" Bạn còn %(left)s lần nộp\n" +" " #: templates/problem/submit.html:224 msgid "You have 0 submissions left" -msgstr "Bạn còn 0 lần nộp" +msgstr "Bạn đã hết lần nộp" #: templates/problem/submit.html:258 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." +msgstr "Không có máy chấm có thể chấm bài này." #: templates/problem/submit.html:262 msgid "Submit!" @@ -4178,15 +4517,15 @@ msgstr "Nộp bài!" #: 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ệ." +msgstr "%(key)s không phải mã xác thực 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." +msgstr "Tài khoả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ệ." +msgstr "Tên đăng nhập hoặc mật khẩu không hợp lệ." #: templates/registration/login.html:61 #: templates/registration/totp_auth.html:39 @@ -4199,7 +4538,7 @@ 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..." +msgstr "Đăng nhập với..." #: templates/registration/logout.html:3 msgid "See you later!" @@ -4207,7 +4546,7 @@ 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." +msgstr "Đổi mật khẩu thành công." #: templates/registration/password_change_form.html:8 msgid "Change Password" @@ -4215,27 +4554,27 @@ 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" +msgstr "Gửi email reset" #: 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" +msgstr "Mật khẩu đã được cập nhật. Hãy thử đăng nhập lại" #: templates/registration/password_reset_confirm.html:9 msgid "Reset Password" -msgstr "Đặt lại mật khẩu" +msgstr "Reset 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 "" +msgstr "Kiểm tra email để xem hướng dẫn đặt mật khẩu." #: templates/registration/password_reset_done.html:5 msgid "" "If you don't receive an email, please make sure you've entered the address " "you registered with, and check your spam folder." -msgstr "" +msgstr "Nếu bạn không nhận được email, hãy kiểm tra hộp thư rác (spam)." #: templates/registration/password_reset_email.txt:1 #, python-format @@ -4243,30 +4582,29 @@ 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." +"Bạn nhận được email này vì bạn đã yêu cầu reset mật khẩu 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:" +msgstr "Đến trang tiếp theo và chọn 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:" +msgstr "Tên đăng nhập, 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!" +msgstr "Cảm ơn bạn đã đồng hành!" #: templates/registration/password_reset_email.txt:11 #, python-format msgid "The %(site_name)s team" -msgstr "Đội ngũ %(site_name)s" +msgstr "%(site_name)s team" #: 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" +msgstr "Reset mật khẩu trên %(site_name)s" #: templates/registration/profile_creation.html:36 #: templates/registration/username_select.html:7 @@ -4275,23 +4613,21 @@ 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." +msgstr "Đăng ký hiện tại đã bị dừng. Hãy liên hệ admin." #: 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." +msgstr "Bạn đã đăng ký thành công. Kiểm tra email để hoàn thành việc xác thực." #: templates/registration/registration_form.html:166 msgid "(again, for confirmation)" -msgstr "(một lần nữa, để xác nhận)" +msgstr "(một lần nữa)" #: templates/registration/registration_form.html:173 msgid "(select your closest major city)" -msgstr "(chọn thành phố gần bạn nhất)" +msgstr "(chọn thành phố gần nhất)" #: templates/registration/registration_form.html:178 msgid "pick from map" @@ -4299,68 +4635,66 @@ msgstr "chọn từ bản đồ" #: templates/registration/registration_form.html:183 msgid "Default language" -msgstr "Ngôn ngữ mặc định" +msgstr "Ngôn ngữ ưa thích" #: templates/registration/registration_form.html:186 -#: templates/user/edit-profile.html:173 +#: templates/user/edit-profile.html:181 msgid "Affiliated organizations" -msgstr "Tổ chức đại diện" +msgstr "Tổ chức bạn muốn tham gia" -#: templates/registration/registration_form.html:192 -#: templates/user/edit-profile.html:128 +#: templates/registration/registration_form.html:195 +#: templates/user/edit-profile.html:136 msgid "Notify me about upcoming contests" -msgstr "Thông báo cho tôi về các cuộc thi sắp tới" +msgstr "Nhận thông báo về các kỳ thi tương lai" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 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" +msgstr "Bạn đồng ý với" #: templates/registration/registration_form.html:210 +msgid "Terms & Conditions" +msgstr "Điều khoản của chúng tôi" + +#: templates/registration/registration_form.html:213 msgid "Register!" -msgstr "Đăng ký!" +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:" +msgstr "" #: 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." +msgstr "" #: 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:" +msgstr "" #: templates/registration/totp_enable.html:72 msgid "QR code" -msgstr "Mã QR" +msgstr "" #: templates/registration/totp_enable.html:73 msgid "Or enter this code manually:" -msgstr "Hoặc nhập mã này thủ công:" +msgstr "" #: templates/stats/language.html:11 msgid "Submission Statistics" -msgstr "Thống kê bài nộp" +msgstr "Thống kê" #: templates/stats/language.html:21 msgid "AC Submissions by Language" -msgstr "Các bài nộp đã AC theo ngôn ngữ" +msgstr "Thống kê AC theo ngôn ngữ" #: templates/status/judge-status-table.html:2 msgid "Judge" @@ -4372,34 +4706,36 @@ msgstr "Trực tuyến" #: templates/status/judge-status-table.html:6 msgid "Uptime" -msgstr "Thời gian hoạt động" +msgstr "" #: templates/status/judge-status-table.html:7 msgid "Ping" msgstr "Ping" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" -msgstr "Tải" +msgstr "Load" #: 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" +msgstr "N/A" #: 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." +msgstr "Không có máy chấm nào hoạt động." #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "ID" #: templates/status/language-list.html:35 msgid "Runtime Info" -msgstr "Thông tin thời gian chạy" +msgstr "Thông tin Runtime" #: templates/status/status-tabs.html:4 msgid "Judges" @@ -4407,7 +4743,7 @@ msgstr "Máy chấm" #: templates/status/status-tabs.html:6 msgid "Version Matrix" -msgstr "Mã trận phiên bản" +msgstr "Phiên bản" #: templates/submission/internal-error-message.html:3 #, python-format @@ -4416,18 +4752,20 @@ msgid "" "administrators have been notified.
In the meantime, try resubmitting in " "a few seconds." msgstr "" +"Lỗi hệ thống đã xảy ra trong lúc chấm bài và các admin %(SITE_NAME)s đã được " +"thông báo.
Hãy thử nộp lại bài sau vài giây." #: 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." +msgstr "Lỗi hệ thống xảy ra trong quá trình chấm." #: templates/submission/internal-error-message.html:15 msgid "Error information" -msgstr "Thông tin về lỗi" +msgstr "Thông tin lỗi" #: templates/submission/list.html:76 msgid "Filter by status..." -msgstr "Lọc theo trạng thái..." +msgstr "Lọc theo kết quả..." #: templates/submission/list.html:82 msgid "Filter by language..." @@ -4439,9 +4777,7 @@ msgstr "Tổng:" #: templates/submission/list.html:355 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." +msgstr "Bạn bị ngắt kết nối. Hãy làm mới để xem cập nhật mới nhất." #: templates/submission/row.html:49 msgid "view" @@ -4453,118 +4789,116 @@ msgstr "chấm lại" #: templates/submission/row.html:58 msgid "admin" -msgstr "quản trị" +msgstr "admin" -#: templates/submission/source.html:25 +#: templates/submission/source.html:29 msgid "View status" -msgstr "Xem trạng thái" +msgstr "Xem kết quả chấm" -#: templates/submission/source.html:26 +#: templates/submission/source.html:30 msgid "View raw source" -msgstr "Xem mã nguồn" +msgstr "Xem mã nguồn" -#: templates/submission/source.html:28 templates/submission/status.html:61 +#: templates/submission/source.html:32 templates/submission/status.html:61 msgid "Resubmit" -msgstr "Gửi lại" +msgstr "Nộp 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..." +msgstr "Các máy chấm đang bận. Hãy kiên nhẫn chờ đợi một chút..." #: 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ý..." +msgstr "Đang chấm..." #: templates/submission/status-testcases.html:14 msgid "Compilation Error" -msgstr "Lỗi dịch" +msgstr "Lỗi biên dịch" #: templates/submission/status-testcases.html:18 msgid "Compilation Warnings" -msgstr "Các cảnh báo Biên dịch" +msgstr "Cảnh báo khi biên dịch" #: templates/submission/status-testcases.html:23 msgid "Pretest Execution Results" -msgstr "Kết quả thực hiện Pretest" +msgstr "Kết quả chạy Pretest" #: templates/submission/status-testcases.html:25 msgid "Execution Results" -msgstr "Kết quả thực hiện" +msgstr "Kết quả chạy" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "Hàng loạt " - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "Tổng cộng: " -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 msgid "Point: " msgstr "Điểm: " -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 msgid "Time: " -msgstr "Time: " +msgstr "Thời gian: " -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 msgid "Memory: " -msgstr "Memory: " +msgstr "Bộ nhớ: " + +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "Nhóm " #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "Trường hợp" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "Test đề bài" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "Bộ test" +#: templates/submission/status-testcases.html:113 +msgid "Point" +msgstr "Điểm" #: templates/submission/status-testcases.html:99 -msgid "Point" -msgstr "Point" +msgid "Case" +msgstr "Test" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "Pretest" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "Test" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "Input:" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "Output:" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 msgid "Answer:" -msgstr "Answer:" +msgstr "Kết quả:" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" -msgstr "Phản hồi:" +msgstr "Phản hồi từ máy chấm:" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 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." +msgstr "AC pretest không đồng nghĩa AC cả bài nhé :))" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" -msgstr "Bài nộp đã bị huỷ!" +msgstr "Đã hủy chấm bài nộp!" #: templates/submission/status.html:59 msgid "View source" -msgstr "Xem nguồn" +msgstr "Xem mã nguồn" #: templates/submission/status.html:88 msgid "Abort" -msgstr "Huỷ bỏ" +msgstr "Hủy chấm" #: templates/submission/submission-list-tabs.html:6 msgid "Mine" -msgstr "Bài của tôi" +msgstr "Tôi" #: templates/submission/submission-list-tabs.html:9 msgid "Best" @@ -4573,43 +4907,43 @@ msgstr "Tốt nhất" #: templates/submission/submission-list-tabs.html:12 #, python-format msgid "%(user)s's" -msgstr "%(user)s's" +msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " -msgstr "Đã mở lại: " +msgstr "Mở lại: " -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " -msgstr "Đã đóng: " +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" +msgstr "Sử dụng thông báo từ desktop" #: templates/ticket/list.html:227 msgid "Show my tickets only" -msgstr "Chỉ hiện thẻ của tôi" +msgstr "Chỉ hiển thị các báo cáo dành cho tôi" #: templates/ticket/list.html:231 msgid "Filing user" -msgstr "" +msgstr "Người báo cáo" #: templates/ticket/list.html:240 msgid "Assignee" -msgstr "Người được hỏi" +msgstr "Người định uỷ thác" #: templates/ticket/list.html:262 msgid "Title" msgstr "Tiêu đề" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" -msgstr "Người được hỏi" +msgstr "Người được ủy thác" #: templates/ticket/new_problem.html:7 msgid "Thanks for opening a ticket!" -msgstr "Cảm ơn bạn đã mở thẻ!" +msgstr "Cảm ơn đã báo cáo!" #: templates/ticket/new_problem.html:9 msgid "" @@ -4617,85 +4951,112 @@ msgid "" "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." +"Lưu ý rằng đây là đơn báo cáo các vấn đề trong đề bài, không phải nơi để hỏi " +"bài hay nộp bài." -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "Đăng" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." -msgstr "Không ai được hỏi." +msgstr "Không ai được ủy thác." -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" -msgstr "Đóng" +msgstr "Đóng báo cáo" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" -msgstr "Mở lại" +msgstr "Mở lại báo cáo" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" -msgstr "" +msgstr "Lưu ý cho người ủy thác" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." -msgstr "Không có gì ở đây." - -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "Gửi" +msgstr "Không có gì." #: templates/user/base-users-table.html:3 msgid "Rank" -msgstr "Xếp hạng" +msgstr "Rank" -#: templates/user/base-users.html:14 templates/user/base-users.html:69 -msgid "Search by handle..." -msgstr "Tìm kiếm bằng tên..." +#: templates/user/edit-profile.html:98 +msgid "Name and School" +msgstr "Họ tên và Trường" -#: templates/user/edit-profile.html:97 -msgid "Self-description" -msgstr "Mô tả bản thân" +#: templates/user/edit-profile.html:100 +msgid "Enter this form" +msgstr "Điền vào link này" + +#: templates/user/edit-profile.html:101 +msgid "It takes some time for admin to approve" +msgstr "Ban quản trị sẽ phê duyệt" #: templates/user/edit-profile.html:105 +msgid "Self-description" +msgstr "Tự giới thiệu" + +#: templates/user/edit-profile.html:113 msgid "Select your closest major city" -msgstr "Chọn thành phố lớn gần nhất" +msgstr "Chọn thành phố gần nhất" -#: templates/user/edit-profile.html:114 +#: templates/user/edit-profile.html:122 msgid "Editor theme" -msgstr "Giao diện khung viết code" +msgstr "Giao diện cho code editor" -#: templates/user/edit-profile.html:119 +#: templates/user/edit-profile.html:127 msgid "Math engine" -msgstr "Math engine" +msgstr "" -#: templates/user/edit-profile.html:143 templates/user/edit-profile.html:144 +#: templates/user/edit-profile.html:151 templates/user/edit-profile.html:152 msgid "Change your avatar" -msgstr "Đổi ảnh đại diện của bạn" +msgstr "Đổi ảnh đại diện" -#: templates/user/edit-profile.html:150 +#: templates/user/edit-profile.html:158 msgid "Change your password" -msgstr "Đổi mật khẩu của bạn" +msgstr "Đổi mật khẩu" -#: templates/user/edit-profile.html:157 +#: templates/user/edit-profile.html:165 msgid "Two Factor Authentication is enabled." -msgstr "" +msgstr "Two Factor Authentication đã được kích hoạt." -#: templates/user/edit-profile.html:164 +#: templates/user/edit-profile.html:172 msgid "Two Factor Authentication is disabled." +msgstr "Two Factor Authentication đã được hủy kích hoạt." + +#: templates/user/edit-profile.html:189 +msgid "User-script" msgstr "" -#: templates/user/edit-profile.html:181 -msgid "User-script" -msgstr "Mã người dùng" - -#: templates/user/edit-profile.html:185 +#: templates/user/edit-profile.html:193 msgid "Update profile" -msgstr "Cập nhật profile" +msgstr "Cập nhật thông tin" + +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +msgid "User File" +msgstr "File người dùng" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" #: templates/user/pp-row.html:22 #, python-format @@ -4708,122 +5069,131 @@ msgstr "" #: templates/user/pp-row.html:27 #, python-format msgid "%(pp).1fpp" -msgstr "" +msgstr "%(pp).1fpp" #: templates/user/pp-row.html:29 #, python-format msgid "%(pp).0fpp" -msgstr "" +msgstr "%(pp).0fpp" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "Bỏ theo dõi" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "Theo dõi" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "Đến từ" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "Người dùng này không chia sẻ thông tin." - -#: templates/user/user-about.html:74 -#, fuzzy -#| msgid "Monday" -msgid "Mon" -msgstr "Thứ Hai" - -#: templates/user/user-about.html:79 -#, fuzzy -#| msgid "Tuesday" -msgid "Tues" -msgstr "Thứ Ba" - -#: templates/user/user-about.html:84 -msgid "Wed" -msgstr "" - -#: templates/user/user-about.html:89 -#, fuzzy -#| msgid "Thursday" -msgid "Thurs" -msgstr "Thứ Năm" - -#: templates/user/user-about.html:94 -#, fuzzy -#| msgid "Friday" -msgid "Fri" -msgstr "Thứ Sáu" - -#: templates/user/user-about.html:99 -#, fuzzy -#| msgid "State" -msgid "Sat" -msgstr "Trạng thái" - -#: templates/user/user-about.html:104 -#, fuzzy -#| msgid "Sunday" -msgid "Sun" -msgstr "Chủ nhật" - -#: templates/user/user-about.html:113 -msgid "Less" -msgstr "" - -#: templates/user/user-about.html:119 -msgid "More" -msgstr "" - -#: templates/user/user-about.html:198 -msgid "past year" -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, python-format msgid "%(counter)s problem solved" msgid_plural "%(counter)s problems solved" -msgstr[0] "" +msgstr[0] "Đã giải %(counter)s bài" -#: templates/user/user-base.html:50 -msgid "Rank by points:" -msgstr "Xếp hạng theo điểm số" +#: templates/user/user-about.html:35 +msgid "Total points" +msgstr "Tổng điểm" -#: templates/user/user-base.html:53 -msgid "Total points:" -msgstr "Tổng điểm:" +#: templates/user/user-about.html:45 +msgid "Rank by rating" +msgstr "Rank theo rating" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" -msgstr "Xếp hạng theo rating:" +#: templates/user/user-about.html:52 +msgid "Rank by points" +msgstr "Rank theo điểm" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "Điểm số:" +#: templates/user/user-about.html:64 +msgid "From" +msgstr "Đến từ" -#: templates/user/user-base.html:71 -msgid "Volatility:" -msgstr "Độ biến động:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "Lưu ý của admin" -#: templates/user/user-base.html:72 +#: templates/user/user-about.html:90 +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 +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 +msgid "Awards" +msgstr "Thành tích" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "%(label)s (%(date)s)" + +#: templates/user/user-about.html:130 +msgid "Mon" +msgstr "Thứ 2" + +#: templates/user/user-about.html:135 +msgid "Tues" +msgstr "Thứ 3" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "Thứ 4" + +#: templates/user/user-about.html:145 +msgid "Thurs" +msgstr "Thứ 5" + +#: templates/user/user-about.html:150 +msgid "Fri" +msgstr "Thứ 6" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "Thứ 7" + +#: templates/user/user-about.html:160 +msgid "Sun" +msgstr "CN" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "Ít" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "Nhiều" + +#: templates/user/user-about.html:184 +msgid "Rating History" +msgstr "Các lần thi" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "năm ngoái" + +#: templates/user/user-about.html:272 +msgid "total submission(s)" +msgstr "bài nộp" + +#: templates/user/user-about.html:276 +msgid "submissions in the last year" +msgstr "bài nộp trong năm qua" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "Bỏ theo dõi" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "Theo dõi" + +#: templates/user/user-base.html:121 +msgid "Send message" +msgstr "Nhắn tin" + +#: templates/user/user-base.html:130 +msgid "Contests written" +msgstr "Số kỳ thi" + +#: templates/user/user-base.html:134 msgid "Min. rating:" -msgstr "Điểm số thấp nhất:" +msgstr "Min. rating:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:138 msgid "Max rating:" -msgstr "Điểm số cao nhất:" +msgstr "Max rating:" #: templates/user/user-list-tabs.html:5 msgid "Friends" @@ -4831,28 +5201,28 @@ msgstr "Bạn bè" #: templates/user/user-problems.html:35 msgid "Points Breakdown" -msgstr "" +msgstr "Phân tích điểm" #: templates/user/user-problems.html:41 msgid "Load more..." -msgstr "Xem thêm..." +msgstr "Tải 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." +msgstr "Người dùng này chưa giải bài nào." #: templates/user/user-problems.html:51 msgid "Authored Problems" -msgstr "" +msgstr "Các bài tập đã ra" #: templates/user/user-problems.html:83 msgid "Hide problems I've solved" -msgstr "Ẩn các bài tôi đã giải được" +msgstr "Ẩn các bài đã giải" #: templates/user/user-problems.html:93 #, python-format msgid "%(points).1f points" -msgstr "" +msgstr "%(points).1f điểm" #: templates/user/user-problems.html:99 msgid "Score" @@ -4861,131 +5231,20 @@ msgstr "Điểm" #: templates/user/user-problems.html:110 #, python-format msgid "%(points)s / %(total)s" -msgstr "" +msgstr "%(points)s / %(total)s" #: templates/user/user-tabs.html:7 msgid "Impersonate" -msgstr "Mật thám" +msgstr "Giả danh" #: templates/user/user-tabs.html:13 msgid "Admin User" -msgstr "Quản trị user" +msgstr "Người dùng" #: templates/user/user-tabs.html:16 msgid "Admin Profile" -msgstr "Quản trị hồ sơ" +msgstr "Thông tin" #: templates/widgets/select_all.html:8 msgid "Check all" msgstr "Chọn tất cả" - -#~ msgid "Rejudge Submissions" -#~ msgstr "Chấm lại bài nộp" - -#~ msgid "Rescore Everything" -#~ msgstr "Chấm lại tất cả" - -#~| msgid "Case #%(case)s" -#~ msgid "Point %(point)s / Case #%(case)s" -#~ msgstr "Point %(point)s / Case #%(case)s" - -#~ msgid "output prefix length override" -#~ msgstr "ghi đè độ dài output prefix" - -#~ msgid "biography" -#~ msgstr "tiểu sử" - -#~ msgid "name" -#~ msgstr "tên" - -#~ msgid "Category of Books" -#~ msgstr "Thể loại sách" - -#~ msgid "Categories of Books" -#~ msgstr "Thể loại sách" - -#~ msgid "title" -#~ msgstr "tiêu đề" - -#~ msgid "author" -#~ msgstr "tác giả" - -#~ msgid "publication date" -#~ msgstr "ngày xuất bản" - -#~ msgid "Book" -#~ msgstr "Sách" - -#~ msgid "Books" -#~ msgstr "Sách" - -#~ msgid "Category of CDs" -#~ msgstr "Thể loại CDs" - -#~ msgid "Categories of CDs" -#~ msgstr "Thể loại CDs" - -#~ msgid "Category of DVDs" -#~ msgstr "Thể loại DVDs" - -#~ msgid "Categories of DVDs" -#~ msgstr "Thể loại DVDs" - -#~ msgid "Django administration" -#~ msgstr "Quản trị viên Django" - -#~ 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." - -#~ 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." - -#~ msgid "Site" -#~ msgstr "Trang" - -#~ msgid "Dashboard" -#~ msgstr "Bảng điều khiển" - -#~ msgid "Applications" -#~ msgstr "Ứng dụng" - -#~ msgid "Color theme" -#~ msgstr "Chủ đề màu sắc" - -#~ msgid "Change color theme" -#~ msgstr "Đổi chủ đề màu sắc" - -#~ msgid "Participation ended." -#~ msgstr "Kết thúc tham gia." - -#~ msgid "Show columns:" -#~ msgstr "Hiển thị các cột:" - -#~ msgid "Output prefix" -#~ msgstr "Tiền tố đầu ra" - -#~ msgid "Output limit" -#~ msgstr "Giới hạn đầu ra" - -#~ msgid "Checker" -#~ msgstr "Kiểm tra" - -#~ msgid "Generator args" -#~ msgstr "Bộ sinh args" - -#~ msgid "Your output (clipped)" -#~ msgstr "Output của bạn (cắt xén)" - -#~ msgid "Resources:" -#~ msgstr "Tài nguyên:" - -#~ msgid "Final score:" -#~ msgstr "Điểm cuối cùng:" diff --git a/locale/vi/LC_MESSAGES/djangojs.po b/locale/vi/LC_MESSAGES/djangojs.po index c6f4afa..7d54bf0 100644 --- a/locale/vi/LC_MESSAGES/djangojs.po +++ b/locale/vi/LC_MESSAGES/djangojs.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: dmoj\n" +"Project-Id-Version: lqdoj2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-04-08 21:06-0500\n" -"PO-Revision-Date: 2019-11-11 22:06\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" +"PO-Revision-Date: 2021-07-20 03:45\n" "Last-Translator: Icyene\n" "Language-Team: Vietnamese\n" "Language: vi_VN\n" @@ -12,9 +12,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: crowdin.com\n" -"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Project: lqdoj2\n" "X-Crowdin-Language: vi\n" "X-Crowdin-File: djangojs.po\n" +"X-Crowdin-Project-ID: 466004\n" +"X-Crowdin-File-ID: 7\n" #: resources/common.js:207 msgctxt "time format with day" diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index ca263ba..ad14d52 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Chinese Simplified\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: zh-CN\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "用户" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "发布时间" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "评论正文" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "德语" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "英语" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "西班牙语" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "法语" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "克罗地亚语" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "匈牙利语" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "韩语" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "罗马尼亚语" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "俄语" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "塞尔维亚文(拉丁字母)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "土耳其语" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "越南语" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "简体中文" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "登录" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "首页" @@ -130,86 +130,88 @@ msgstr "取消隐藏选定评论" msgid "Associated page" msgstr "关联页" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "带标签的竞赛" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "题目" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "时间计划" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "详细信息" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "评分" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "司法" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." msgstr[0] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." msgstr[0] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "用户名" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "模拟竞赛" @@ -217,15 +219,15 @@ msgstr "模拟竞赛" msgid "link path" msgstr "链接路径" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "内容" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "概要" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -247,8 +249,9 @@ msgid "Taxonomy" msgstr "分类" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "分数" @@ -303,6 +306,7 @@ msgid "User" msgstr "用户" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "电子邮箱" @@ -334,7 +338,7 @@ msgstr "排除题目" msgid "These problems are NOT allowed to be submitted in this language" msgstr "这些题目不允许使用该语言解决" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "描述" @@ -381,7 +385,7 @@ msgstr "您没有为这么多程序重新评分的权利。" msgid "Rejudge the selected submissions" msgstr "重新评分选定的程序" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -391,8 +395,8 @@ msgstr[0] "%d个程序提交的分数已被重新计算。" msgid "Rescore the selected submissions" msgstr "重新计算选定程序的分数" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "题目代码" @@ -403,8 +407,9 @@ msgstr "题目名称" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "时间" @@ -418,7 +423,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "内存" @@ -467,6 +472,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -479,7 +488,7 @@ msgstr "订阅有关于竞赛的资讯" msgid "Enable experimental features" msgstr "允许使用实验性功能" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "你不能参与超过 {count} 个组织" @@ -493,11 +502,13 @@ msgstr "裁判服务器" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "用户名" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "密码" @@ -517,7 +528,7 @@ msgstr "题目代码必须匹配 ^[a-z0-9]+$" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "竞赛标识必须匹配 ^[a-z0-9]+$" @@ -525,12 +536,12 @@ msgstr "竞赛标识必须匹配 ^[a-z0-9]+$" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "Y年n月j日 G:i" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "{time}" @@ -592,7 +603,7 @@ msgstr "评论" msgid "comments" msgstr "评论" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "%s 的题解" @@ -631,148 +642,195 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "无效的颜色。" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "标签名称" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "只允许小写字母和连字号(-)。" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "标签颜色" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "标签说明" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "竞赛标签" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "竞赛标签" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +#, fuzzy +#| msgid "View user participation" +msgid "Hidden for duration of participation" +msgstr "查看用户参与历史" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "竞赛标识" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "竞赛名称" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to edit the contest." msgstr "这些人将可以编辑竞赛。" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "这些人将可以编辑竞赛。" + +#: judge/models/contest.py:68 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the contest, but not edit it." +msgstr "这些人将可以编辑竞赛。" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "描述" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "题目" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "开始时间" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "结束时间" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "时间限制" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "公开" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "竞赛参与评分" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "竞赛是否参与用户评分" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "隐藏记分板" +#: judge/models/contest.py:82 +#, fuzzy +#| msgid "public visibility" +msgid "scoreboard visibility" +msgstr "公共可见性" -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." +#: judge/models/contest.py:83 +#, fuzzy +#| msgid "" +#| "Whether the scoreboard should remain hidden for the duration of the " +#| "contest." +msgid "Scoreboard visibility through the duration of the contest" msgstr "记分牌是否在比赛期间保持隐藏。" -#: judge/models/contest.py:71 +#: judge/models/contest.py:85 +#, fuzzy +#| msgid "hide scoreboard" +msgid "view contest scoreboard" +msgstr "隐藏记分板" + +#: judge/models/contest.py:87 +#, fuzzy +#| msgid "These people will be able to edit the contest." +msgid "These users will be able to view the scoreboard." +msgstr "这些人将可以编辑竞赛。" + +#: judge/models/contest.py:88 msgid "no comments" msgstr "没有评论" -#: judge/models/contest.py:72 +#: judge/models/contest.py:89 msgid "Use clarification system instead of comments." msgstr "请使用澄清系统,而不是评论" -#: judge/models/contest.py:74 +#: judge/models/contest.py:91 msgid "Rating floor for contest" msgstr "" -#: judge/models/contest.py:76 +#: judge/models/contest.py:93 msgid "Rating ceiling for contest" msgstr "" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "rate all" msgstr "为所有用户评分" -#: judge/models/contest.py:78 +#: judge/models/contest.py:95 msgid "Rate all users who joined." msgstr "所有参与竞赛的用户,包含没有提交任何程序的用户,都将被评分。" -#: judge/models/contest.py:79 +#: judge/models/contest.py:96 msgid "exclude from ratings" msgstr "不会被评分" -#: judge/models/contest.py:81 +#: judge/models/contest.py:98 msgid "private to specific users" msgstr "" -#: judge/models/contest.py:82 +#: judge/models/contest.py:99 msgid "private contestants" msgstr "" -#: judge/models/contest.py:83 +#: judge/models/contest.py:100 msgid "If private, only these users may see the contest" msgstr "" -#: judge/models/contest.py:85 +#: judge/models/contest.py:102 msgid "hide problem tags" msgstr "隐藏题目标签" -#: judge/models/contest.py:86 +#: judge/models/contest.py:103 msgid "Whether problem tags should be hidden by default." msgstr "设置竞赛内题目标签是否默认被隐藏。" -#: judge/models/contest.py:88 +#: judge/models/contest.py:105 msgid "run pretests only" msgstr "只运行预测试" -#: judge/models/contest.py:89 +#: judge/models/contest.py:106 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -781,289 +839,304 @@ msgstr "" "设置裁判服务器是否只运行预测试而不是所有测试。通常在竞赛进行时启动,然后在竞" "赛结束后重新评分前关闭。" -#: judge/models/contest.py:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "只对组织可见" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "组织" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "选中时,只对选择的组织才可见" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "OpenGraph 图像" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "实时参与者数" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "竞赛简介" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 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:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "访问码" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "不受欢迎人物" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 #, fuzzy #| msgid "test case points" msgid "precision points" msgstr "测试点分值" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "查看私人竞赛" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "编辑我的竞赛" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "编辑全部竞赛" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "计算积分的比赛" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "比赛访问码" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +#, fuzzy +#| msgid "contest problems" +msgid "Edit contest problem label script" +msgstr "竞赛题目" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "竞赛" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "竞赛" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "关联的竞赛" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "得分" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "累积时间" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "虚拟参与信息编号" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 #, fuzzy #| msgid "0 means non-virtual, otherwise the n-th virtual participation" msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "0 表示正式参与,否则表示第n次虚拟参与。" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "%s旁观%s中" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "%s于%s的第%d次虚拟参与" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "%s参与%s中" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "竞赛参与信息" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "竞赛参与信息" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "题目" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "分" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "部分" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "仅通过预测试" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "顺序" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 #, fuzzy #| msgid "submission test cases" msgid "visible testcases" msgstr "程序测试" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "此问题的最大提交数量,或输入0表示无限制" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "为什么包括一个你不能提交的问题?" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "竞赛题目" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "竞赛题目" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "提交信息" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "参与" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "该程序是否只通过预测试。" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "竞赛提交信息" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "竞赛提交历史" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "排名" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "评分" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "波动性" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "上次评分" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "竞赛评分信息" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "竞赛评分历史" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1103,7 +1176,7 @@ msgstr "父项" msgid "post title" msgstr "文章标题" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "作者" @@ -1111,7 +1184,7 @@ msgstr "作者" msgid "slug" msgstr "网址标识" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "公共可见性" @@ -1135,15 +1208,21 @@ msgstr "发布摘要" msgid "openGraph image" msgstr "openGraph 图像" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +#, fuzzy +#| msgid "If private, only these organizations may see the contest" +msgid "If private, only these organizations may see the blog post." +msgstr "选中时,只对选择的组织才可见" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "编辑所有的帖子" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "博客文章" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "博客文章" @@ -1303,7 +1382,7 @@ msgid "" "are supported." msgstr "这个问题的时间限制(以秒为单位。支持小数秒计时方式(例如1.5)。" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "内存限制" @@ -1376,188 +1455,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "语言" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "翻译题目名" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "翻译题目正文" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "题目翻译" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "题目翻译" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "已澄清的问题" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "澄清的身体" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "澄清时间戳" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "语言特定资源限制" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "语言特定资源限制" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "关联的题目" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "发布日期" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "可编辑的内容" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "题目讲解" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "题目讲解" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "标准" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "浮点数" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "浮点数(仅绝对值)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "浮点数(仅相对值)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "无尾随空格" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "无序的" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "字节全等" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "zip数据文件" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "生成器文件" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "输出前缀长度" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "输出限制长度" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "init.yml生成反馈" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "检查器" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "检查器参数" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "检查器参数作为JSON对象" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "题目数据集" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "测试编号" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "测试类型" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "正常测试" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "测试组开始" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "测试组结束" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "输入的文件的名称" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "输出文件的名称" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "生成器参数" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "分数" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "是否为预测试?" @@ -1630,7 +1709,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "组织" @@ -1726,31 +1805,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "用户信息" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "用户信息" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "请求时间" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "状态" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "原因" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "组织加入请求" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "组织加入请求" @@ -1848,88 +1927,88 @@ msgstr "扩展" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "源文件扩展名,例如:\"py\"或\"cpp\"。" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "语言" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "软件属于的语言" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "拥有次语言的裁判服务器" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "软件名称" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "软件版本" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "软件显示顺序" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "服务器名称" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "创建时间" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 #, fuzzy #| msgid "A key to authenticated this judge" msgid "A key to authenticate this judge" msgstr "裁判服务器连接密匙" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "连接密匙" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "裁判在线状态" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "裁判启动时间" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "响应时间" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "系统负载" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "最后一分钟的系统负载(每处理器平均值)" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "裁判服务器" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "裁判服务器" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "接受" @@ -1958,7 +2037,7 @@ msgid "Runtime Error" msgstr "运行错误" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "编译错误" @@ -2153,12 +2232,24 @@ msgstr "海报" msgid "message time" msgstr "消息时间" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "第[page]页,共[topage]页" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, fuzzy, python-format +#| msgid "Page %d of Posts" +msgid "Page %s of %s" +msgstr "帖子第%d页" + +#: judge/tasks/contest.py:19 +#, fuzzy +#| msgid "Recalculate scores" +msgid "Recalculating contest scores" +msgstr "重新计算总分" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2170,62 +2261,62 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "不允许测试组为空。" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 #, fuzzy #| msgid "How did you corrupt the generator path?" msgid "How did you corrupt the custom checker path?" msgstr "你怎么使生成器路径崩溃?" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "编号为%d的组外测试必须设置分数。" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "编号为%d的测试输入文件不存在:%s" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "编号为%d的测试输出文件不存在:%s" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "编号为%d的测试组必须设置分数。" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "测试编号%d:试图在组外结束测试组。" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "你怎么损坏zip文件路径???" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "你怎么使生成器路径崩溃?" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "无法同时使用 queryset 和关键字筛选" @@ -2265,8 +2356,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "自我介绍" @@ -2274,7 +2365,7 @@ msgstr "自我介绍" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "帖子第%d页" @@ -2291,7 +2382,7 @@ msgstr "" msgid "You already voted." msgstr "你已经投了票。" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "从网站中上编辑" @@ -2299,132 +2390,142 @@ msgstr "从网站中上编辑" msgid "Editing comment" msgstr "编辑评论" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "该竞赛不存在" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "找不到标识符为“%s“的竞赛。" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "竞赛" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "找不到该竞赛。" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "对竞赛”%s“的访问被拒绝" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "竞赛不在进行" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "“%s“不在进行。" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "已经参与了竞赛" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "您已经参与了竞赛:”%s“。" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "输入”%s“的访问码" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "你不是在竞赛\"%s\"中。" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "%(month)s的竞赛" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, fuzzy, python-format #| msgid "Statistics" msgid "%s Statistics" msgstr "统计数据" -#: judge/views/contests.py:601 -msgid "???" -msgstr "???" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "%s 排行榜" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "你在%s中的参与历史" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "%s在%s中的参与历史" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "实时" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "参与历史" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "竞赛标签:%s" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "问题说明" + +#: judge/views/contests.py:911 +#, fuzzy, python-format +#| msgid "clarification body" +msgid "New clarification for %s" +msgstr "澄清的身体" + #: judge/views/error.py:14 msgid "404 error" msgstr "404 错误" @@ -2454,162 +2555,164 @@ msgstr "语言" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "无该组织" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "找不到标识符为”%s“的组织。" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "组织" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "%s 成员列表" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "加入组织" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "你已经是该组织的成员。" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "该组织不开放。" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "离开组织" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "你不是是“%s”的成员。" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "请求加入 %s" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "组织加入请求详细信息" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "管理 %s 的加入请求" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "你的组织只能再接受%d个用户,无法接受%d个。" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "批准了%d个用户。" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "拒绝了%d个用户。" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "编辑 %s" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "无法编辑组织" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "您没有编辑该组织的权利。" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "你没有踢组织成员的权利。" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "无法踢用户" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "你想踢的用户不存在!" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "你想踢的用户不是组织成员:%s" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "无该题目" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "找不到代码为“%s”的题目。" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "{0} 的题解" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "{0}的题解" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "题目" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "禁止提交" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "您在该题目不受欢迎。您被永久禁止为该题目提交解决程序。" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "提交太多了" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "您已超出此问题的提交限制。" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "提交于 %(problem)s" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2650,22 +2753,22 @@ msgstr "编辑%s的测试数据" msgid "Generated init.yml for %s" msgstr "为%s生成的init.yml" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2713,25 +2816,25 @@ msgstr "首选语言" msgid "Subscribe to newsletter?" msgstr "订阅简讯" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "电子邮件地址“%s“已被使用。每个电子邮件地址只允许一个账户。" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" "由于滥用历史,我们不允许您的电子邮件提供商。请使用有信誉的电子邮件提供商。" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "注册" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "身份验证失败" @@ -2747,13 +2850,13 @@ msgstr "状态" msgid "Version matrix" msgstr "版本矩阵" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "%(user)s 在 %(problem)s 的提交结果" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "所有提交历史" @@ -2809,10 +2912,6 @@ msgstr "{0}{3} 第 {2} 题提交的 msgid "Ticket title" msgstr "工单标题" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "问题说明" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2864,42 +2963,52 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "无该用户" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "无名为“%s“的用户" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "我的帐户" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "用户 %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +#, fuzzy +#| msgid "M j, Y, G:i" +msgid "M j, Y" +msgstr "Y年n月j日 G:i" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "Y年n月j日 G:i" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "在网站上更新" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "编辑个人资料" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "排行榜" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2937,7 +3046,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "查看提交历史" @@ -2952,53 +3061,53 @@ msgstr "编辑用户" msgid "Rejudge" msgstr "重新评分" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "你好,%(username)s。" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "登出" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "登录" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "或" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "旁观中" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "本网站启用 JavaScript 效果最好。" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "编辑" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -3009,6 +3118,11 @@ msgstr "" " 于 %(time)s 张贴 \n" " " +#: templates/blog/content.html:10 +#, python-brace-format +msgid "posted on {time}" +msgstr "贴在 {time}" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -3020,81 +3134,83 @@ msgstr "" " 在 %(time)s\n" " " -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "更新" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "活动" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "新闻" -#: templates/blog/list.html:116 -#, python-brace-format -msgid "posted on {time}" -msgstr "贴在 {time}" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "澄清" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "目前还没有作出任何澄清。" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "进行中的竞赛" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "未来的竞赛" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "我的活动工单" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "新工单" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "新题目" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "评论流" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "在线评测系统" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 +#: templates/chat/message.html:20 #, fuzzy -#| msgid "Admin" -msgid "Admins" -msgstr "管理" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" -msgstr "用户" +#| msgid "Delete?" +msgid "Delete" +msgstr "删除?" #: templates/comments/list.html:2 msgid "Comments" @@ -3126,7 +3242,8 @@ msgstr "链接" msgid "Reply" msgstr "回复" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "隐藏" @@ -3216,6 +3333,11 @@ msgstr "星期五" msgid "Saturday" msgstr "星期六" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "创建" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3245,7 +3367,7 @@ msgstr "清单" msgid "Calendar" msgstr "日历" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "资料和信息" @@ -3258,7 +3380,7 @@ msgstr "统计数据" msgid "Rankings" msgstr "排行榜" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "隐藏的排名" @@ -3270,29 +3392,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "离开竞赛" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "参加虚拟竞赛" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "停止旁观" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "旁观竞赛" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "参加竞赛" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "登录即可进入" @@ -3325,62 +3446,88 @@ msgstr "从 %(start_time)s 开始的 %(length)s 时间段" msgid "AC Rate" msgstr "AC率" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "用户" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "编辑" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "你确定你想要加入吗?" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "计时器在你第一次参加比赛的时候就会启动,比赛开始后将不会停止" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organizations" +msgid "Organizations..." +msgstr "组织" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "旁观" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "加入!" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +#, fuzzy +#| msgid "Search problems..." +msgid "Search contests..." +msgstr "搜索题目…" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "竞赛" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "进行中的竞赛" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "未来的竞赛" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "现在没有预定的竞赛。" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "过去的竞赛" @@ -3431,15 +3578,21 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "只有下列组织可能访问此竞赛:" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "组织" -#: templates/contest/ranking-table.html:41 +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +#, fuzzy +#| msgid "full name" +msgid "Full Name" +msgstr "全名字" + +#: templates/contest/ranking-table.html:44 msgid "Un-Disqualify" msgstr "" -#: templates/contest/ranking-table.html:44 +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3455,47 +3608,59 @@ msgstr "你确定你想要加入吗?" msgid "Are you sure you want to un-disqualify this participation?" msgstr "你确定你想要加入吗?" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "查看用户参与历史" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "显示机构" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 #, fuzzy #| msgid "full name" msgid "Show full name" msgstr "全名字" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 #, fuzzy #| msgid "Show my tickets only" msgid "Show friends only" msgstr "只显示我的工单" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +#, fuzzy +#| msgid "virtual participation id" +msgid "Show virtual participation" +msgstr "虚拟参与信息编号" + +#: templates/contest/stats.html:51 #, fuzzy #| msgid "problem translation" msgid "Problem Status Distribution" msgstr "题目翻译" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "题目名称" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +#, fuzzy +#| msgid "problem translation" +msgid "Problem Point Distribution" +msgstr "题目翻译" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "按语言的提交数量" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "语言提交接受率" @@ -3617,58 +3782,97 @@ msgstr "激活" msgid "Update" msgstr "升级" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "加入组织" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "申请加入" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organizations" +msgid "Organization news" +msgstr "组织" + +#: templates/organization/home.html:128 +#, fuzzy +#| msgid "There are no scheduled contests at this time." +msgid "There is no news at this time." +msgstr "现在没有预定的竞赛。" + +#: templates/organization/home.html:137 +#, fuzzy +#| msgid "Contest" +msgid "Controls" +msgstr "竞赛" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "编辑组织" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "查看请求" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "管理组织" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "查看成员" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "离开组织" + +#: templates/organization/home.html:183 +#, fuzzy +#| msgid "See private contests" +msgid "New private contests" +msgstr "查看私人竞赛" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +#, fuzzy +#| msgid "View as PDF" +msgid "View all" +msgstr "PDF 视图" + +#: templates/organization/home.html:199 +#, fuzzy +#| msgid "New problems" +msgid "New private problems" +msgstr "新题目" + +#: templates/organization/list.html:40 +#, fuzzy +#| msgid "Show organizations" +msgid "Show my organizations only" +msgstr "显示机构" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "名称" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "用户:" @@ -3701,7 +3905,7 @@ msgid "There are no requests to approve." msgstr "没有请求批准。" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "删除?" @@ -3737,37 +3941,37 @@ msgstr "踢出" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "Information" msgid "Instruction" msgstr "信息" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "查看 YAML" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "类型" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "输入文件" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "输出文件" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "预测试?" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "添加新的用例" @@ -3782,28 +3986,34 @@ msgstr "" "和题解的作者。

在真正解决问题之前提交题解的代码是可以封禁的罪行。" "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "根据类型过滤" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "热门问题" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "分类" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "类型" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "AC%%" +#: templates/problem/list.html:342 +#, fuzzy +#| msgid "Clarifications" +msgid "Add clarifications" +msgstr "澄清" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3812,198 +4022,202 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "提交筛选" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "位置" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "Too many submissions" +msgid "Download selected submissions" +msgstr "提交太多了" -#: templates/problem/manage_submission.html:158 -#, fuzzy, python-format -#| msgid "Rescore the selected submissions" -msgid "This will rescore %(count)d submissions." -msgstr "重新计算选定程序的分数" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, fuzzy, python-format #| msgid "Are you sure you want to join?" msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "你确定你想要加入吗?" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "PDF 视图" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "提交程序" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "还剩%(counter)s 提交数" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "还剩下 0 次提交" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "我的提交历史" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "提交排行" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "Too many submissions" -msgid "Download AC submissions" -msgstr "提交太多了" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "阅读题解" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "管理工单" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "编辑题目" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "编辑测试数据" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "复制题目" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "分数:" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "(部分)" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "时间限制:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "内存限制:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "作者:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "题目类型" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "允许的语言" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "没有支持 %(lang)s 的裁判服务器。" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 #, fuzzy #| msgid "Judge" msgid "Judge:" msgid_plural "Judges:" msgstr[0] "评测" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "提出问题" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "反馈问题" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -4033,25 +4247,25 @@ msgstr "显示题目类型" msgid "Show editorial" msgstr "阅读题解" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "所有" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "题目类型" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "分数范围" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "搜索" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "随机" @@ -4225,20 +4439,20 @@ msgstr "默认语言" msgid "Affiliated organizations" msgstr "关联的组织" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "通过Email发送未来竞赛的通知" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "注册即表示您同意我们的" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "使用条款" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "注册!" @@ -4296,6 +4510,7 @@ msgid "Ping" msgstr "延迟" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "负载" @@ -4311,6 +4526,7 @@ msgid "There are no judges available at this time." msgstr "本语言没有可用的裁判服务器。" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "ID" @@ -4326,6 +4542,14 @@ msgstr "裁判服务器" msgid "Version Matrix" msgstr "版本矩阵" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "评分时裁判服务端发生了内部错误。" @@ -4342,10 +4566,6 @@ msgstr "按状态过滤" msgid "Filter by language..." msgstr "按语言筛选......" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "提交筛选" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4402,79 +4622,80 @@ msgstr "预测试执行结果" msgid "Execution Results" msgstr "执行结果" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "批" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points:" msgid "Point: " msgstr "分数:" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time:" msgid "Time: " msgstr "时间:" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "内存" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "批" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "测试" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "预测试" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "测试情况" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "分数" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "测试" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "预测试" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "测试情况" + +#: templates/submission/status-testcases.html:141 #, fuzzy #| msgid "Input file" msgid "Input:" msgstr "输入文件" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 #, fuzzy #| msgid "Output file" msgid "Output:" msgstr "输出文件" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "答案错误" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 #, fuzzy #| msgid "judging feedback" msgid "Judge feedback:" msgstr "评测反馈" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "通过预测试不代表程序可以通过完整测试。" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "评分终止!" @@ -4499,11 +4720,11 @@ msgstr "最佳" msgid "%(user)s's" msgstr "%(user)s 的" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "重新打开状态: " -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "已关闭: " @@ -4527,7 +4748,7 @@ msgstr "被分配的人" msgid "Title" msgstr "标题" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "被分配的人" @@ -4544,34 +4765,34 @@ msgstr "" "请注意, 此表单用于报告题目描述中的问题, 而不是寻求帮助。如果您需要询问解题方" "法, 请在评论中进行提问。" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "帖子" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "相关的项目" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "没有人被分配到这个工单。" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "关闭工单" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "重开工单" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "受让人说明" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "暂无内容!" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "帖子" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "排名" @@ -4620,6 +4841,28 @@ msgstr "用户脚本" msgid "Update profile" msgstr "更新资料" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "用户信息" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4641,62 +4884,161 @@ msgstr "%(pp).1fpp" msgid "%(pp).0fpp" msgstr "%(pp).0fpp" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "组织" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "您还没有共享的任何信息。" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "此用户没有共享的任何信息。" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, fuzzy, python-format #| msgid "contest problems" 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:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "Total points:" +msgid "Total points" msgstr "总得分:" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rank by rating:" +msgid "Rank by rating" msgstr "竞赛评分排名:" -#: templates/user/user-base.html:70 -msgid "Rating:" -msgstr "竞赛评分:" +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "Rank by points:" +msgid "Rank by points" +msgstr "得分排名:" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:64 +msgid "From" +msgstr "组织" + +#: templates/user/user-about.html:75 +msgid "Admin Notes" +msgstr "" + +#: templates/user/user-about.html:90 +msgid "You have not shared any information." +msgstr "您还没有共享的任何信息。" + +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." +msgstr "此用户没有共享的任何信息。" + +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, fuzzy, python-format +#| msgctxt "contest problem" +#| msgid "%(problem)s in %(contest)s" +msgid "%(label)s (%(date)s)" +msgstr "%(contest)s 中的 %(problem)s" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "星期一" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "星期二" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "星期四" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "星期五" + +#: templates/user/user-about.html:155 +#, fuzzy +#| msgid "State" +msgid "Sat" +msgstr "状态" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "星期日" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "编辑历史" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "所有提交历史" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission test case" +msgid "submissions in the last year" +msgstr "程序测试" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +#, fuzzy +#| msgid "" +#| "\n" +#| " You have %(left)s submission left\n" +#| " " +#| msgid_plural "" +#| "\n" +#| " You have %(left)s submissions left\n" +#| " " +msgid "Contests written" +msgstr "" +"\n" +" 您还剩下 %(left)s 次提交机会 \n" +" " + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "波动性:" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "最低评分:" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "最高评分:" @@ -4754,6 +5096,26 @@ msgstr "管理资料" msgid "Check all" msgstr "全选" +#, fuzzy +#~| msgid "%(counter)s submission left" +#~| msgid_plural "%(counter)s submissions left" +#~ msgid "%(cnt)d submission on %(date)s" +#~ msgid_plural "%(cnt)d submissions on %(date)s" +#~ msgstr[0] "还剩%(counter)s 提交数" + +#~ msgid "Rating:" +#~ msgstr "竞赛评分:" + +#, fuzzy +#~| msgid "Admin" +#~ msgid "Admins" +#~ msgstr "管理" + +#, fuzzy +#~| msgid "Rescore the selected submissions" +#~ msgid "This will rescore %(count)d submissions." +#~ msgstr "重新计算选定程序的分数" + #, fuzzy #~| msgid "%(points)s / %(total)s" #~ msgid "Point %(point)s / Case #%(case)s" diff --git a/locale/zh_Hans/LC_MESSAGES/djangojs.po b/locale/zh_Hans/LC_MESSAGES/djangojs.po index 6531402..8b46b5f 100644 --- a/locale/zh_Hans/LC_MESSAGES/djangojs.po +++ b/locale/zh_Hans/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Chinese Simplified\n" @@ -26,4 +26,3 @@ msgstr[0] "%d 天 %h:%m:%s" 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 index 151d1cf..24bd3ae 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-27 03:41+0700\n" +"POT-Creation-Date: 2021-10-25 05:59+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Chinese Traditional\n" @@ -16,93 +16,93 @@ msgstr "" "X-Crowdin-Language: zh-TW\n" "X-Crowdin-File: django.po\n" -#: chat_box/models.py:15 judge/admin/interface.py:107 -#: judge/models/contest.py:260 judge/models/contest.py:384 -#: judge/models/profile.py:208 +#: chat_box/models.py:16 judge/admin/interface.py:110 +#: judge/models/contest.py:403 judge/models/contest.py:528 +#: judge/models/profile.py:211 msgid "user" msgstr "使用者" -#: chat_box/models.py:16 judge/models/comment.py:43 judge/models/comment.py:191 +#: chat_box/models.py:17 judge/models/comment.py:43 judge/models/comment.py:191 msgid "posted time" msgstr "發佈時間" -#: chat_box/models.py:17 judge/models/comment.py:47 +#: chat_box/models.py:18 judge/models/comment.py:47 msgid "body of comment" msgstr "" -#: chat_box/views.py:42 templates/chat/chat.html:4 +#: chat_box/views.py:29 templates/chat/chat.html:4 msgid "Chat Box" msgstr "" -#: dmoj/settings.py:351 +#: dmoj/settings.py:355 msgid "German" msgstr "德文" -#: dmoj/settings.py:352 +#: dmoj/settings.py:356 msgid "English" msgstr "英文" -#: dmoj/settings.py:353 +#: dmoj/settings.py:357 msgid "Spanish" msgstr "西班牙文" -#: dmoj/settings.py:354 +#: dmoj/settings.py:358 msgid "French" msgstr "法文" -#: dmoj/settings.py:355 +#: dmoj/settings.py:359 msgid "Croatian" msgstr "克羅地亞文" -#: dmoj/settings.py:356 +#: dmoj/settings.py:360 msgid "Hungarian" msgstr "匈牙利文" -#: dmoj/settings.py:357 +#: dmoj/settings.py:361 msgid "Japanese" msgstr "" -#: dmoj/settings.py:358 +#: dmoj/settings.py:362 msgid "Korean" msgstr "韓文" -#: dmoj/settings.py:359 +#: dmoj/settings.py:363 msgid "Brazilian Portuguese" msgstr "" -#: dmoj/settings.py:360 +#: dmoj/settings.py:364 msgid "Romanian" msgstr "羅馬尼亞文" -#: dmoj/settings.py:361 +#: dmoj/settings.py:365 msgid "Russian" msgstr "俄文" -#: dmoj/settings.py:362 +#: dmoj/settings.py:366 msgid "Serbian (Latin)" msgstr "塞爾維亞文 (拉丁語系)" -#: dmoj/settings.py:363 +#: dmoj/settings.py:367 msgid "Turkish" msgstr "土耳其文" -#: dmoj/settings.py:364 +#: dmoj/settings.py:368 msgid "Vietnamese" msgstr "越南文" -#: dmoj/settings.py:365 +#: dmoj/settings.py:369 msgid "Simplified Chinese" msgstr "簡體中文" -#: dmoj/settings.py:366 +#: dmoj/settings.py:370 msgid "Traditional Chinese" msgstr "" -#: dmoj/urls.py:57 +#: dmoj/urls.py:58 msgid "Login" msgstr "登入" -#: dmoj/urls.py:105 templates/base.html:192 +#: dmoj/urls.py:106 templates/base.html:193 msgid "Home" msgstr "首頁" @@ -130,86 +130,88 @@ msgstr "取消隱藏回應" msgid "Associated page" msgstr "關聯頁" -#: judge/admin/contest.py:28 +#: judge/admin/contest.py:30 msgid "Included contests" msgstr "" -#: judge/admin/contest.py:64 templates/contest/contest.html:83 -#: templates/contest/moss.html:43 templates/problem/list.html:206 -#: templates/problem/list.html:224 templates/user/user-problems.html:56 +#: judge/admin/contest.py:66 templates/contest/clarification.html:42 +#: templates/contest/contest.html:83 templates/contest/moss.html:43 +#: templates/problem/list.html:214 templates/problem/list.html:232 +#: templates/problem/list.html:350 templates/user/user-problems.html:56 #: templates/user/user-problems.html:98 msgid "Problem" msgstr "題目" -#: judge/admin/contest.py:112 +#: judge/admin/contest.py:119 msgid "Settings" msgstr "" -#: judge/admin/contest.py:114 +#: judge/admin/contest.py:121 msgid "Scheduling" msgstr "排程" -#: judge/admin/contest.py:115 +#: judge/admin/contest.py:122 templates/organization/home.html:107 msgid "Details" msgstr "詳細資訊" -#: judge/admin/contest.py:116 +#: judge/admin/contest.py:123 msgid "Format" msgstr "" -#: judge/admin/contest.py:117 templates/contest/ranking-table.html:7 +#: judge/admin/contest.py:124 templates/contest/ranking-table.html:7 +#: templates/user/user-about.html:15 templates/user/user-about.html:45 msgid "Rating" msgstr "評分" -#: judge/admin/contest.py:118 +#: judge/admin/contest.py:125 msgid "Access" msgstr "" -#: judge/admin/contest.py:120 judge/admin/problem.py:131 +#: judge/admin/contest.py:127 judge/admin/problem.py:131 msgid "Justice" msgstr "" -#: judge/admin/contest.py:158 +#: judge/admin/contest.py:207 #, python-format msgid "%d contest successfully marked as visible." msgid_plural "%d contests successfully marked as visible." msgstr[0] "" -#: judge/admin/contest.py:161 +#: judge/admin/contest.py:210 msgid "Mark contests as visible" msgstr "" -#: judge/admin/contest.py:165 +#: judge/admin/contest.py:216 #, python-format msgid "%d contest successfully marked as hidden." msgid_plural "%d contests successfully marked as hidden." msgstr[0] "" -#: judge/admin/contest.py:168 +#: judge/admin/contest.py:219 msgid "Mark contests as hidden" msgstr "" -#: judge/admin/contest.py:182 judge/admin/submission.py:164 +#: judge/admin/contest.py:233 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:256 +#: judge/admin/contest.py:308 #, python-format msgid "%d participation recalculated." msgid_plural "%d participations recalculated." msgstr[0] "" -#: judge/admin/contest.py:259 +#: judge/admin/contest.py:311 msgid "Recalculate results" msgstr "" -#: judge/admin/contest.py:263 judge/admin/organization.py:65 +#: judge/admin/contest.py:315 judge/admin/organization.py:65 msgid "username" msgstr "使用者名稱" -#: judge/admin/contest.py:268 templates/base.html:276 +#: judge/admin/contest.py:320 templates/base.html:277 msgid "virtual" msgstr "" @@ -217,15 +219,15 @@ msgstr "" msgid "link path" msgstr "" -#: judge/admin/interface.py:62 +#: judge/admin/interface.py:65 msgid "Content" msgstr "内容" -#: judge/admin/interface.py:63 +#: judge/admin/interface.py:66 msgid "Summary" msgstr "概要" -#: judge/admin/interface.py:148 +#: judge/admin/interface.py:151 msgid "object" msgstr "" @@ -247,8 +249,9 @@ msgid "Taxonomy" msgstr "" #: judge/admin/problem.py:128 templates/contest/contest.html:84 -#: templates/problem/data.html:472 templates/problem/list.html:214 -#: templates/problem/list.html:240 templates/user/base-users-table.html:10 +#: templates/problem/data.html:429 templates/problem/list.html:222 +#: templates/problem/list.html:248 templates/user/base-users-table.html:10 +#: templates/user/user-about.html:36 templates/user/user-about.html:52 #: templates/user/user-problems.html:58 msgid "Points" msgstr "分數" @@ -303,6 +306,7 @@ msgid "User" msgstr "使用者" #: judge/admin/profile.py:91 templates/registration/registration_form.html:145 +#: templates/user/import/table_csv.html:8 msgid "Email" msgstr "電子郵件" @@ -334,7 +338,7 @@ msgstr "" msgid "These problems are NOT allowed to be submitted in this language" msgstr "" -#: judge/admin/runtime.py:83 +#: judge/admin/runtime.py:83 templates/problem/list.html:352 msgid "Description" msgstr "描述說明" @@ -381,7 +385,7 @@ msgstr "" msgid "Rejudge the selected submissions" msgstr "" -#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#: judge/admin/submission.py:193 judge/views/problem_manage.py:159 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." @@ -391,8 +395,8 @@ msgstr[0] "" msgid "Rescore the selected submissions" msgstr "" -#: judge/admin/submission.py:200 templates/problem/list.html:208 -#: templates/problem/list.html:228 +#: judge/admin/submission.py:200 templates/problem/list.html:216 +#: templates/problem/list.html:236 msgid "Problem code" msgstr "" @@ -403,8 +407,9 @@ msgstr "題目名稱" #: judge/admin/submission.py:215 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:13 -#: templates/submission/status-testcases.html:105 -#: templates/submission/status-testcases.html:107 +#: templates/problem/list.html:351 +#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:127 msgid "Time" msgstr "時間" @@ -418,7 +423,7 @@ msgstr "%d KB" msgid "%.2f MB" msgstr "%.2f MB" -#: judge/admin/submission.py:227 templates/submission/status-testcases.html:112 +#: judge/admin/submission.py:227 templates/submission/status-testcases.html:132 msgid "Memory" msgstr "記憶體" @@ -467,6 +472,10 @@ msgstr "" msgid "ECOO" msgstr "" +#: judge/contest_format/icpc.py:19 +msgid "ICPC" +msgstr "" + #: judge/contest_format/ioi.py:19 msgid "IOI" msgstr "" @@ -479,7 +488,7 @@ msgstr "" msgid "Enable experimental features" msgstr "" -#: judge/forms.py:57 judge/views/organization.py:127 +#: judge/forms.py:57 judge/views/organization.py:168 judge/views/register.py:49 #, python-brace-format msgid "You may not be part of more than {count} public organizations." msgstr "" @@ -491,11 +500,13 @@ msgstr "" #: judge/forms.py:112 judge/views/register.py:26 #: templates/registration/registration_form.html:139 #: templates/user/base-users-table.html:5 +#: templates/user/import/table_csv.html:4 msgid "Username" msgstr "使用者名稱" #: judge/forms.py:113 templates/registration/registration_form.html:151 #: templates/registration/registration_form.html:165 +#: templates/user/import/table_csv.html:5 msgid "Password" msgstr "密碼" @@ -515,7 +526,7 @@ msgstr "" msgid "Problem with code already exists." msgstr "" -#: judge/forms.py:158 judge/models/contest.py:52 +#: judge/forms.py:158 judge/models/contest.py:61 msgid "Contest id must be ^[a-z0-9]+$" msgstr "" @@ -523,12 +534,12 @@ msgstr "" msgid "Contest with key already exists." msgstr "" -#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: judge/jinja2/datetime.py:26 templates/blog/blog.html:26 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" msgstr "" -#: judge/jinja2/datetime.py:26 +#: judge/jinja2/datetime.py:26 templates/chat/message.html:13 #, python-brace-format msgid "{time}" msgstr "" @@ -590,7 +601,7 @@ msgstr "" msgid "comments" msgstr "" -#: judge/models/comment.py:137 judge/models/problem.py:406 +#: judge/models/comment.py:137 judge/models/problem.py:443 #, python-format msgid "Editorial for %s" msgstr "" @@ -627,431 +638,473 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:22 +#: judge/models/contest.py:23 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:24 +#: judge/models/contest.py:25 msgid "tag name" msgstr "" -#: judge/models/contest.py:25 +#: judge/models/contest.py:26 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:26 +#: judge/models/contest.py:27 msgid "tag colour" msgstr "" -#: judge/models/contest.py:27 +#: judge/models/contest.py:28 msgid "tag description" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:47 msgid "contest tag" msgstr "" -#: judge/models/contest.py:47 judge/models/contest.py:101 +#: judge/models/contest.py:48 judge/models/contest.py:118 msgid "contest tags" msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:56 +msgid "Visible" +msgstr "" + +#: judge/models/contest.py:57 +msgid "Hidden for duration of contest" +msgstr "" + +#: judge/models/contest.py:58 +msgid "Hidden for duration of participation" +msgstr "" + +#: judge/models/contest.py:60 msgid "contest id" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:62 msgid "contest name" msgstr "" -#: judge/models/contest.py:54 -msgid "These people will be able to edit the contest." +#: judge/models/contest.py:63 +msgid "These users will be able to edit the contest." msgstr "" -#: judge/models/contest.py:56 judge/models/runtime.py:133 +#: judge/models/contest.py:65 +msgid "" +"These users will be able to edit the contest, but will not be listed as " +"authors." +msgstr "" + +#: judge/models/contest.py:68 +msgid "These users will be able to view the contest, but not edit it." +msgstr "" + +#: judge/models/contest.py:71 judge/models/runtime.py:136 msgid "description" msgstr "" -#: judge/models/contest.py:57 judge/models/problem.py:353 -#: judge/models/runtime.py:135 +#: judge/models/contest.py:72 judge/models/problem.py:390 +#: judge/models/runtime.py:138 msgid "problems" msgstr "" -#: judge/models/contest.py:58 judge/models/contest.py:261 +#: judge/models/contest.py:73 judge/models/contest.py:404 msgid "start time" msgstr "" -#: judge/models/contest.py:59 +#: judge/models/contest.py:74 msgid "end time" msgstr "" -#: judge/models/contest.py:60 judge/models/problem.py:118 -#: judge/models/problem.py:377 +#: judge/models/contest.py:75 judge/models/problem.py:118 +#: judge/models/problem.py:414 msgid "time limit" msgstr "" -#: judge/models/contest.py:61 judge/models/problem.py:136 +#: judge/models/contest.py:76 judge/models/problem.py:136 msgid "publicly visible" msgstr "" -#: judge/models/contest.py:62 +#: judge/models/contest.py:77 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:65 +#: judge/models/contest.py:80 msgid "contest rated" msgstr "" -#: judge/models/contest.py:65 +#: judge/models/contest.py:80 msgid "Whether this contest can be rated." msgstr "" -#: judge/models/contest.py:67 -msgid "hide scoreboard" -msgstr "" - -#: judge/models/contest.py:68 -msgid "" -"Whether the scoreboard should remain hidden for the duration of the contest." -msgstr "" - -#: judge/models/contest.py:71 -msgid "no comments" -msgstr "" - -#: judge/models/contest.py:72 -msgid "Use clarification system instead of comments." -msgstr "" - -#: judge/models/contest.py:74 -msgid "Rating floor for contest" -msgstr "" - -#: judge/models/contest.py:76 -msgid "Rating ceiling for contest" -msgstr "" - -#: judge/models/contest.py:78 -msgid "rate all" -msgstr "" - -#: judge/models/contest.py:78 -msgid "Rate all users who joined." -msgstr "" - -#: judge/models/contest.py:79 -msgid "exclude from ratings" -msgstr "" - -#: judge/models/contest.py:81 -msgid "private to specific users" -msgstr "" - #: judge/models/contest.py:82 -msgid "private contestants" +msgid "scoreboard visibility" msgstr "" #: judge/models/contest.py:83 -msgid "If private, only these users may see the contest" +msgid "Scoreboard visibility through the duration of the contest" msgstr "" #: judge/models/contest.py:85 -msgid "hide problem tags" +msgid "view contest scoreboard" msgstr "" -#: judge/models/contest.py:86 -msgid "Whether problem tags should be hidden by default." +#: judge/models/contest.py:87 +msgid "These users will be able to view the scoreboard." msgstr "" #: judge/models/contest.py:88 -msgid "run pretests only" +msgid "no comments" msgstr "" #: judge/models/contest.py:89 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:91 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:93 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:95 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:95 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:96 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:98 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:99 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:100 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:102 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:103 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:105 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:106 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:93 judge/models/problem.py:157 +#: judge/models/contest.py:110 judge/models/interface.py:77 +#: judge/models/problem.py:157 msgid "private to organizations" msgstr "" -#: judge/models/contest.py:94 judge/models/problem.py:155 -#: judge/models/profile.py:77 +#: judge/models/contest.py:111 judge/models/interface.py:75 +#: judge/models/problem.py:155 judge/models/profile.py:77 msgid "organizations" msgstr "" -#: judge/models/contest.py:95 +#: judge/models/contest.py:112 msgid "If private, only these organizations may see the contest" msgstr "" -#: judge/models/contest.py:96 judge/models/problem.py:145 +#: judge/models/contest.py:113 judge/models/problem.py:145 msgid "OpenGraph image" msgstr "" -#: judge/models/contest.py:97 judge/models/profile.py:48 +#: judge/models/contest.py:114 judge/models/profile.py:48 msgid "Logo override image" msgstr "" -#: judge/models/contest.py:99 +#: judge/models/contest.py:116 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "" -#: judge/models/contest.py:102 +#: judge/models/contest.py:119 msgid "the amount of live participants" msgstr "" -#: judge/models/contest.py:103 +#: judge/models/contest.py:120 msgid "contest summary" msgstr "" -#: judge/models/contest.py:104 judge/models/problem.py:147 +#: judge/models/contest.py:121 judge/models/problem.py:147 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:105 judge/models/profile.py:47 +#: judge/models/contest.py:122 judge/models/profile.py:47 msgid "access code" msgstr "" -#: judge/models/contest.py:106 +#: judge/models/contest.py:123 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:108 judge/models/problem.py:141 +#: judge/models/contest.py:125 judge/models/problem.py:141 msgid "personae non gratae" msgstr "" -#: judge/models/contest.py:109 +#: judge/models/contest.py:126 msgid "Bans the selected users from joining this contest." msgstr "" -#: judge/models/contest.py:110 +#: judge/models/contest.py:127 msgid "contest format" msgstr "" -#: judge/models/contest.py:111 +#: judge/models/contest.py:128 msgid "The contest format module to use." msgstr "" -#: judge/models/contest.py:112 +#: judge/models/contest.py:129 msgid "contest format configuration" msgstr "" -#: judge/models/contest.py:113 +#: judge/models/contest.py:130 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:116 +#: judge/models/contest.py:137 msgid "precision points" msgstr "" -#: judge/models/contest.py:118 +#: judge/models/contest.py:139 msgid "Number of digits to round points to." msgstr "" -#: judge/models/contest.py:242 +#: judge/models/contest.py:383 msgid "See private contests" msgstr "" -#: judge/models/contest.py:243 +#: judge/models/contest.py:384 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:244 +#: judge/models/contest.py:385 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:245 +#: judge/models/contest.py:386 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:246 templates/contest/moss.html:74 +#: judge/models/contest.py:387 templates/contest/moss.html:74 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:247 +#: judge/models/contest.py:388 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:248 +#: judge/models/contest.py:389 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:249 +#: judge/models/contest.py:390 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:251 judge/models/contest.py:348 -#: judge/models/contest.py:385 judge/models/contest.py:408 +#: judge/models/contest.py:391 +msgid "Change contest visibility" +msgstr "" + +#: judge/models/contest.py:392 +msgid "Edit contest problem label script" +msgstr "" + +#: judge/models/contest.py:394 judge/models/contest.py:492 +#: judge/models/contest.py:529 judge/models/contest.py:552 #: judge/models/submission.py:84 msgid "contest" msgstr "" -#: judge/models/contest.py:252 +#: judge/models/contest.py:395 msgid "contests" msgstr "" -#: judge/models/contest.py:259 +#: judge/models/contest.py:402 msgid "associated contest" msgstr "" -#: judge/models/contest.py:262 +#: judge/models/contest.py:405 msgid "score" msgstr "得分" -#: judge/models/contest.py:263 +#: judge/models/contest.py:406 msgid "cumulative time" msgstr "累計時間" -#: judge/models/contest.py:264 +#: judge/models/contest.py:407 msgid "is disqualified" msgstr "" -#: judge/models/contest.py:265 +#: judge/models/contest.py:408 msgid "Whether this participation is disqualified." msgstr "" -#: judge/models/contest.py:266 +#: judge/models/contest.py:409 +msgid "tie-breaking field" +msgstr "" + +#: judge/models/contest.py:410 msgid "virtual participation id" msgstr "" -#: judge/models/contest.py:267 +#: judge/models/contest.py:411 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "" -#: judge/models/contest.py:268 +#: judge/models/contest.py:412 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:334 +#: judge/models/contest.py:478 #, python-format msgid "%s spectating in %s" msgstr "" -#: judge/models/contest.py:336 +#: judge/models/contest.py:480 #, python-format msgid "%s in %s, v%d" msgstr "" -#: judge/models/contest.py:337 +#: judge/models/contest.py:481 #, python-format msgid "%s in %s" msgstr "" -#: judge/models/contest.py:340 +#: judge/models/contest.py:484 msgid "contest participation" msgstr "" -#: judge/models/contest.py:341 +#: judge/models/contest.py:485 msgid "contest participations" msgstr "" -#: judge/models/contest.py:347 judge/models/contest.py:369 -#: judge/models/contest.py:409 judge/models/problem.py:352 -#: judge/models/problem.py:357 judge/models/problem.py:375 -#: judge/models/problem_data.py:38 +#: judge/models/contest.py:491 judge/models/contest.py:513 +#: judge/models/contest.py:553 judge/models/problem.py:389 +#: judge/models/problem.py:394 judge/models/problem.py:412 +#: judge/models/problem_data.py:40 msgid "problem" msgstr "題目" -#: judge/models/contest.py:349 judge/models/contest.py:373 +#: judge/models/contest.py:493 judge/models/contest.py:517 #: judge/models/problem.py:129 msgid "points" msgstr "分" -#: judge/models/contest.py:350 +#: judge/models/contest.py:494 msgid "partial" msgstr "部分" -#: judge/models/contest.py:351 judge/models/contest.py:374 +#: judge/models/contest.py:495 judge/models/contest.py:518 msgid "is pretested" msgstr "" -#: judge/models/contest.py:352 judge/models/interface.py:43 +#: judge/models/contest.py:496 judge/models/interface.py:43 msgid "order" msgstr "" -#: judge/models/contest.py:353 +#: judge/models/contest.py:497 msgid "0 to not show testcases, 1 to show" msgstr "" -#: judge/models/contest.py:354 +#: judge/models/contest.py:498 msgid "visible testcases" msgstr "" -#: judge/models/contest.py:355 +#: judge/models/contest.py:499 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "" -#: judge/models/contest.py:357 +#: judge/models/contest.py:501 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:362 +#: judge/models/contest.py:506 msgid "contest problem" msgstr "" -#: judge/models/contest.py:363 +#: judge/models/contest.py:507 msgid "contest problems" msgstr "" -#: judge/models/contest.py:367 judge/models/submission.py:183 +#: judge/models/contest.py:511 judge/models/submission.py:183 msgid "submission" msgstr "" -#: judge/models/contest.py:371 judge/models/contest.py:386 +#: judge/models/contest.py:515 judge/models/contest.py:530 msgid "participation" msgstr "" -#: judge/models/contest.py:375 +#: judge/models/contest.py:519 msgid "Whether this submission was ran only on pretests." msgstr "" -#: judge/models/contest.py:379 +#: judge/models/contest.py:523 msgid "contest submission" msgstr "" -#: judge/models/contest.py:380 +#: judge/models/contest.py:524 msgid "contest submissions" msgstr "" -#: judge/models/contest.py:388 +#: judge/models/contest.py:532 msgid "rank" msgstr "排名" -#: judge/models/contest.py:389 +#: judge/models/contest.py:533 msgid "rating" msgstr "" -#: judge/models/contest.py:390 +#: judge/models/contest.py:534 msgid "volatility" msgstr "" -#: judge/models/contest.py:391 +#: judge/models/contest.py:535 msgid "last rated" msgstr "" -#: judge/models/contest.py:395 +#: judge/models/contest.py:539 msgid "contest rating" msgstr "" -#: judge/models/contest.py:396 +#: judge/models/contest.py:540 msgid "contest ratings" msgstr "" -#: judge/models/contest.py:416 +#: judge/models/contest.py:560 msgid "contest moss result" msgstr "" -#: judge/models/contest.py:417 +#: judge/models/contest.py:561 msgid "contest moss results" msgstr "" @@ -1091,7 +1144,7 @@ msgstr "" msgid "post title" msgstr "" -#: judge/models/interface.py:67 judge/models/problem.py:395 +#: judge/models/interface.py:67 judge/models/problem.py:432 msgid "authors" msgstr "" @@ -1099,7 +1152,7 @@ msgstr "" msgid "slug" msgstr "" -#: judge/models/interface.py:69 judge/models/problem.py:393 +#: judge/models/interface.py:69 judge/models/problem.py:430 msgid "public visibility" msgstr "" @@ -1123,15 +1176,19 @@ msgstr "" msgid "openGraph image" msgstr "" -#: judge/models/interface.py:91 +#: judge/models/interface.py:76 +msgid "If private, only these organizations may see the blog post." +msgstr "" + +#: judge/models/interface.py:105 msgid "Edit all posts" msgstr "" -#: judge/models/interface.py:93 +#: judge/models/interface.py:107 msgid "blog post" msgstr "" -#: judge/models/interface.py:94 +#: judge/models/interface.py:108 msgid "blog posts" msgstr "" @@ -1291,7 +1348,7 @@ msgid "" "are supported." msgstr "" -#: judge/models/problem.py:123 judge/models/problem.py:380 +#: judge/models/problem.py:123 judge/models/problem.py:417 msgid "memory limit" msgstr "記憶體限制" @@ -1364,188 +1421,188 @@ msgstr "" 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:108 +#: judge/models/problem.py:395 judge/models/problem.py:413 +#: judge/models/runtime.py:111 msgid "language" msgstr "" -#: judge/models/problem.py:359 +#: judge/models/problem.py:396 msgid "translated name" msgstr "" -#: judge/models/problem.py:360 +#: judge/models/problem.py:397 msgid "translated description" msgstr "" -#: judge/models/problem.py:364 +#: judge/models/problem.py:401 msgid "problem translation" msgstr "" -#: judge/models/problem.py:365 +#: judge/models/problem.py:402 msgid "problem translations" msgstr "" -#: judge/models/problem.py:369 +#: judge/models/problem.py:406 msgid "clarified problem" msgstr "" -#: judge/models/problem.py:370 +#: judge/models/problem.py:407 msgid "clarification body" msgstr "" -#: judge/models/problem.py:371 +#: judge/models/problem.py:408 msgid "clarification timestamp" msgstr "" -#: judge/models/problem.py:386 +#: judge/models/problem.py:423 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:387 +#: judge/models/problem.py:424 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:391 +#: judge/models/problem.py:428 msgid "associated problem" msgstr "" -#: judge/models/problem.py:394 +#: judge/models/problem.py:431 msgid "publish date" msgstr "" -#: judge/models/problem.py:396 +#: judge/models/problem.py:433 msgid "editorial content" msgstr "" -#: judge/models/problem.py:412 +#: judge/models/problem.py:449 msgid "solution" msgstr "題解" -#: judge/models/problem.py:413 +#: judge/models/problem.py:450 msgid "solutions" msgstr "題解" -#: judge/models/problem_data.py:24 +#: judge/models/problem_data.py:26 msgid "Standard" msgstr "標準" -#: judge/models/problem_data.py:25 +#: judge/models/problem_data.py:27 msgid "Floats" msgstr "浮點數" -#: judge/models/problem_data.py:26 +#: judge/models/problem_data.py:28 msgid "Floats (absolute)" msgstr "浮點數(絕對值)" -#: judge/models/problem_data.py:27 +#: judge/models/problem_data.py:29 msgid "Floats (relative)" msgstr "浮點數(相對值)" -#: judge/models/problem_data.py:28 +#: judge/models/problem_data.py:30 msgid "Non-trailing spaces" msgstr "" -#: judge/models/problem_data.py:29 +#: judge/models/problem_data.py:31 msgid "Unordered" msgstr "" -#: judge/models/problem_data.py:30 +#: judge/models/problem_data.py:32 msgid "Byte identical" msgstr "" -#: judge/models/problem_data.py:31 +#: judge/models/problem_data.py:33 msgid "Line-by-line" msgstr "" -#: judge/models/problem_data.py:32 +#: judge/models/problem_data.py:34 msgid "Custom checker (PY)" msgstr "" -#: judge/models/problem_data.py:33 +#: judge/models/problem_data.py:35 msgid "Custom validator (CPP)" msgstr "" -#: judge/models/problem_data.py:40 +#: judge/models/problem_data.py:42 msgid "data zip file" msgstr "" -#: judge/models/problem_data.py:42 +#: judge/models/problem_data.py:44 msgid "generator file" msgstr "" -#: judge/models/problem_data.py:44 judge/models/problem_data.py:110 +#: judge/models/problem_data.py:46 judge/models/problem_data.py:121 msgid "output prefix length" msgstr "" -#: judge/models/problem_data.py:45 judge/models/problem_data.py:111 +#: judge/models/problem_data.py:47 judge/models/problem_data.py:122 msgid "output limit length" msgstr "" -#: judge/models/problem_data.py:46 +#: judge/models/problem_data.py:48 msgid "init.yml generation feedback" msgstr "" -#: judge/models/problem_data.py:47 judge/models/problem_data.py:112 +#: judge/models/problem_data.py:49 judge/models/problem_data.py:123 msgid "checker" msgstr "" -#: judge/models/problem_data.py:48 judge/models/problem_data.py:113 +#: judge/models/problem_data.py:50 judge/models/problem_data.py:124 msgid "checker arguments" msgstr "" -#: judge/models/problem_data.py:49 judge/models/problem_data.py:114 +#: judge/models/problem_data.py:51 judge/models/problem_data.py:125 msgid "checker arguments as a JSON object" msgstr "" -#: judge/models/problem_data.py:50 +#: judge/models/problem_data.py:52 msgid "custom checker file" msgstr "" -#: judge/models/problem_data.py:56 +#: judge/models/problem_data.py:58 msgid "custom validator file" msgstr "" -#: judge/models/problem_data.py:97 +#: judge/models/problem_data.py:108 msgid "problem data set" msgstr "" -#: judge/models/problem_data.py:99 +#: judge/models/problem_data.py:110 msgid "case position" msgstr "" -#: judge/models/problem_data.py:100 +#: judge/models/problem_data.py:111 msgid "case type" msgstr "" -#: judge/models/problem_data.py:101 +#: judge/models/problem_data.py:112 msgid "Normal case" msgstr "" -#: judge/models/problem_data.py:102 +#: judge/models/problem_data.py:113 msgid "Batch start" msgstr "" -#: judge/models/problem_data.py:103 +#: judge/models/problem_data.py:114 msgid "Batch end" msgstr "" -#: judge/models/problem_data.py:105 +#: judge/models/problem_data.py:116 msgid "input file name" msgstr "" -#: judge/models/problem_data.py:106 +#: judge/models/problem_data.py:117 msgid "output file name" msgstr "" -#: judge/models/problem_data.py:107 +#: judge/models/problem_data.py:118 msgid "generator arguments" msgstr "" -#: judge/models/problem_data.py:108 +#: judge/models/problem_data.py:119 msgid "point value" msgstr "" -#: judge/models/problem_data.py:109 +#: judge/models/problem_data.py:120 msgid "case is pretest?" msgstr "" @@ -1618,7 +1675,7 @@ msgid "" msgstr "" #: judge/models/profile.py:76 judge/models/profile.py:93 -#: judge/models/profile.py:209 +#: judge/models/profile.py:212 msgid "organization" msgstr "" @@ -1714,31 +1771,31 @@ msgstr "" msgid "Notes for administrators regarding this user." msgstr "" -#: judge/models/profile.py:203 +#: judge/models/profile.py:206 msgid "user profile" msgstr "使用者個人檔案" -#: judge/models/profile.py:204 +#: judge/models/profile.py:207 msgid "user profiles" msgstr "使用者個人檔案" -#: judge/models/profile.py:211 +#: judge/models/profile.py:214 msgid "request time" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:215 msgid "state" msgstr "" -#: judge/models/profile.py:217 +#: judge/models/profile.py:220 msgid "reason" msgstr "" -#: judge/models/profile.py:220 +#: judge/models/profile.py:223 msgid "organization join request" msgstr "" -#: judge/models/profile.py:221 +#: judge/models/profile.py:224 msgid "organization join requests" msgstr "" @@ -1829,86 +1886,86 @@ msgstr "" msgid "The extension of source files, e.g., \"py\" or \"cpp\"." msgstr "" -#: judge/models/runtime.py:109 +#: judge/models/runtime.py:112 msgid "languages" msgstr "語言" -#: judge/models/runtime.py:113 +#: judge/models/runtime.py:116 msgid "language to which this runtime belongs" msgstr "" -#: judge/models/runtime.py:114 +#: judge/models/runtime.py:117 msgid "judge on which this runtime exists" msgstr "" -#: judge/models/runtime.py:115 +#: judge/models/runtime.py:118 msgid "runtime name" msgstr "" -#: judge/models/runtime.py:116 +#: judge/models/runtime.py:119 msgid "runtime version" msgstr "" -#: judge/models/runtime.py:117 +#: judge/models/runtime.py:120 msgid "order in which to display this runtime" msgstr "" -#: judge/models/runtime.py:121 +#: judge/models/runtime.py:124 msgid "Server name, hostname-style" msgstr "" -#: judge/models/runtime.py:122 +#: judge/models/runtime.py:125 msgid "time of creation" msgstr "" -#: judge/models/runtime.py:123 +#: judge/models/runtime.py:126 msgid "A key to authenticate this judge" msgstr "" -#: judge/models/runtime.py:124 +#: judge/models/runtime.py:127 msgid "authentication key" msgstr "" -#: judge/models/runtime.py:125 +#: judge/models/runtime.py:128 msgid "block judge" msgstr "" -#: judge/models/runtime.py:126 +#: judge/models/runtime.py:129 msgid "" "Whether this judge should be blocked from connecting, even if its key is " "correct." msgstr "" -#: judge/models/runtime.py:128 +#: judge/models/runtime.py:131 msgid "judge online status" msgstr "" -#: judge/models/runtime.py:129 +#: judge/models/runtime.py:132 msgid "judge start time" msgstr "" -#: judge/models/runtime.py:130 +#: judge/models/runtime.py:133 msgid "response time" msgstr "" -#: judge/models/runtime.py:131 +#: judge/models/runtime.py:134 msgid "system load" msgstr "" -#: judge/models/runtime.py:132 +#: judge/models/runtime.py:135 msgid "Load for the last minute, divided by processors to be fair." msgstr "" -#: judge/models/runtime.py:136 judge/models/runtime.py:176 +#: judge/models/runtime.py:139 judge/models/runtime.py:179 msgid "judges" msgstr "" -#: judge/models/runtime.py:175 +#: judge/models/runtime.py:178 msgid "judge" msgstr "" #: judge/models/submission.py:20 judge/models/submission.py:47 -#: judge/utils/problems.py:77 +#: judge/utils/problems.py:79 msgid "Accepted" msgstr "接受" @@ -1937,7 +1994,7 @@ msgid "Runtime Error" msgstr "運行時錯誤" #: judge/models/submission.py:27 judge/models/submission.py:41 -#: judge/models/submission.py:55 judge/utils/problems.py:79 +#: judge/models/submission.py:55 judge/utils/problems.py:81 msgid "Compile Error" msgstr "編譯錯誤" @@ -2132,12 +2189,21 @@ msgstr "" msgid "message time" msgstr "" -#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 -#: judge/pdf_problems.py:246 +#: judge/pdf_problems.py:147 judge/pdf_problems.py:199 +#: judge/pdf_problems.py:259 msgid "Page [page] of [topage]" msgstr "" -#: judge/tasks/moss.py:25 +#: judge/pdf_problems.py:280 +#, python-format +msgid "Page %s of %s" +msgstr "" + +#: judge/tasks/contest.py:19 +msgid "Recalculating contest scores" +msgstr "" + +#: judge/tasks/contest.py:40 msgid "Running MOSS" msgstr "" @@ -2149,60 +2215,60 @@ msgstr "" msgid "Recalculating user points" msgstr "" -#: judge/utils/problem_data.py:68 +#: judge/utils/problem_data.py:70 msgid "Empty batches not allowed." msgstr "" -#: judge/utils/problem_data.py:76 judge/utils/problem_data.py:97 +#: judge/utils/problem_data.py:78 judge/utils/problem_data.py:99 msgid "How did you corrupt the custom checker path?" msgstr "" -#: judge/utils/problem_data.py:118 +#: judge/utils/problem_data.py:120 #, python-format msgid "Points must be defined for non-batch case #%d." msgstr "" -#: judge/utils/problem_data.py:123 +#: judge/utils/problem_data.py:125 #, python-format msgid "Input file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:126 +#: judge/utils/problem_data.py:128 #, python-format msgid "Output file for case %d does not exist: %s" msgstr "" -#: judge/utils/problem_data.py:151 +#: judge/utils/problem_data.py:153 #, python-format msgid "Batch start case #%d requires points." msgstr "" -#: judge/utils/problem_data.py:172 +#: judge/utils/problem_data.py:174 #, python-format msgid "Attempt to end batch outside of one in case #%d" msgstr "" -#: judge/utils/problem_data.py:190 +#: judge/utils/problem_data.py:192 msgid "How did you corrupt the zip path?" msgstr "" -#: judge/utils/problem_data.py:196 +#: judge/utils/problem_data.py:198 msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problems.py:78 +#: judge/utils/problems.py:80 msgid "Wrong" msgstr "" -#: judge/utils/problems.py:80 +#: judge/utils/problems.py:82 msgid "Timeout" msgstr "" -#: judge/utils/problems.py:81 +#: judge/utils/problems.py:83 msgid "Error" msgstr "" -#: judge/utils/problems.py:92 +#: judge/utils/problems.py:94 msgid "Can't pass both queryset and keyword filters" msgstr "" @@ -2242,8 +2308,8 @@ msgctxt "hours and minutes" msgid "%h:%m" msgstr "%h:%m" -#: judge/views/about.py:7 templates/user/user-about.html:47 -#: templates/user/user-tabs.html:4 +#: judge/views/about.py:7 templates/organization/home.html:112 +#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 msgid "About" msgstr "" @@ -2251,7 +2317,7 @@ msgstr "" msgid "Custom Checker Sample" msgstr "" -#: judge/views/blog.py:38 +#: judge/views/blog.py:45 #, python-format msgid "Page %d of Posts" msgstr "" @@ -2268,7 +2334,7 @@ msgstr "" msgid "You already voted." msgstr "" -#: judge/views/comment.py:126 judge/views/organization.py:299 +#: judge/views/comment.py:126 judge/views/organization.py:344 msgid "Edited from site" msgstr "" @@ -2276,131 +2342,140 @@ msgstr "" msgid "Editing comment" msgstr "" -#: judge/views/contests.py:55 judge/views/contests.py:215 -#: judge/views/contests.py:218 judge/views/contests.py:389 +#: judge/views/contests.py:57 judge/views/contests.py:247 +#: judge/views/contests.py:250 judge/views/contests.py:424 msgid "No such contest" msgstr "" -#: judge/views/contests.py:56 judge/views/contests.py:216 +#: judge/views/contests.py:58 judge/views/contests.py:248 #, python-format msgid "Could not find a contest with the key \"%s\"." msgstr "" -#: judge/views/contests.py:81 +#: judge/views/contests.py:71 msgid "Contests" msgstr "" -#: judge/views/contests.py:219 +#: judge/views/contests.py:251 msgid "Could not find such contest." msgstr "" -#: judge/views/contests.py:222 +#: judge/views/contests.py:254 #, python-format msgid "Access to contest \"%s\" denied" msgstr "" -#: judge/views/contests.py:246 +#: judge/views/contests.py:278 msgid "Clone Contest" msgstr "" -#: judge/views/contests.py:309 +#: judge/views/contests.py:343 msgid "Contest not ongoing" msgstr "" -#: judge/views/contests.py:310 +#: judge/views/contests.py:344 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "" -#: judge/views/contests.py:314 +#: judge/views/contests.py:348 msgid "Already in contest" msgstr "" -#: judge/views/contests.py:315 +#: judge/views/contests.py:349 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "" -#: judge/views/contests.py:318 +#: judge/views/contests.py:352 msgid "Banned from joining" msgstr "" -#: judge/views/contests.py:319 +#: judge/views/contests.py:353 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "" -#: judge/views/contests.py:379 +#: judge/views/contests.py:414 #, python-format msgid "Enter access code for \"%s\"" msgstr "" -#: judge/views/contests.py:390 +#: judge/views/contests.py:425 #, python-format msgid "You are not in contest \"%s\"." msgstr "" -#: judge/views/contests.py:409 +#: judge/views/contests.py:444 msgid "ContestCalendar requires integer year and month" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 #, python-format msgid "Contests in %(month)s" msgstr "" -#: judge/views/contests.py:449 +#: judge/views/contests.py:484 msgid "F Y" msgstr "" -#: judge/views/contests.py:496 +#: judge/views/contests.py:532 #, python-format msgid "%s Statistics" msgstr "" -#: judge/views/contests.py:601 -msgid "???" -msgstr "" - -#: judge/views/contests.py:664 +#: judge/views/contests.py:717 #, python-format msgid "%s Rankings" msgstr "" -#: judge/views/contests.py:680 +#: judge/views/contests.py:725 +msgid "???" +msgstr "" + +#: judge/views/contests.py:741 #, python-format msgid "Your participation in %s" msgstr "" -#: judge/views/contests.py:681 +#: judge/views/contests.py:742 #, python-format msgid "%s's participation in %s" msgstr "" -#: judge/views/contests.py:685 +#: judge/views/contests.py:749 msgid "Live" msgstr "" -#: judge/views/contests.py:697 templates/contest/contest-tabs.html:16 +#: judge/views/contests.py:761 templates/contest/contest-tabs.html:13 msgid "Participation" msgstr "" -#: judge/views/contests.py:743 +#: judge/views/contests.py:808 #, python-format msgid "%s MOSS Results" msgstr "" -#: judge/views/contests.py:770 +#: judge/views/contests.py:835 #, python-format msgid "Running MOSS for %s..." msgstr "" -#: judge/views/contests.py:793 +#: judge/views/contests.py:858 #, python-format msgid "Contest tag: %s" msgstr "" +#: judge/views/contests.py:868 judge/views/ticket.py:57 +msgid "Issue description" +msgstr "" + +#: judge/views/contests.py:911 +#, python-format +msgid "New clarification for %s" +msgstr "" + #: judge/views/error.py:14 msgid "404 error" msgstr "" @@ -2430,162 +2505,164 @@ msgstr "" msgid "Notifications (%d unseen)" msgstr "" -#: judge/views/organization.py:44 judge/views/organization.py:47 +#: judge/views/organization.py:59 judge/views/organization.py:62 msgid "No such organization" msgstr "" -#: judge/views/organization.py:45 +#: judge/views/organization.py:60 #, python-format msgid "Could not find an organization with the key \"%s\"." msgstr "" -#: judge/views/organization.py:48 +#: judge/views/organization.py:63 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:6 +#: judge/views/organization.py:79 judge/views/register.py:34 +#: templates/organization/list.html:32 templates/user/import/table_csv.html:9 +#: templates/user/user-list-tabs.html:6 msgid "Organizations" msgstr "" -#: judge/views/organization.py:93 +#: judge/views/organization.py:130 #, python-format msgid "%s Members" msgstr "" -#: judge/views/organization.py:118 judge/views/organization.py:121 -#: judge/views/organization.py:126 +#: judge/views/organization.py:159 judge/views/organization.py:162 +#: judge/views/organization.py:167 msgid "Joining organization" msgstr "" -#: judge/views/organization.py:118 +#: judge/views/organization.py:159 msgid "You are already in the organization." msgstr "" -#: judge/views/organization.py:121 +#: judge/views/organization.py:162 msgid "This organization is not open." msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 msgid "Leaving organization" msgstr "" -#: judge/views/organization.py:138 +#: judge/views/organization.py:179 #, python-format msgid "You are not in \"%s\"." msgstr "" -#: judge/views/organization.py:162 +#: judge/views/organization.py:203 #, python-format msgid "Request to join %s" msgstr "" -#: judge/views/organization.py:180 +#: judge/views/organization.py:221 msgid "Join request detail" msgstr "" -#: judge/views/organization.py:209 +#: judge/views/organization.py:254 #, python-format msgid "Managing join requests for %s" msgstr "" -#: judge/views/organization.py:240 +#: judge/views/organization.py:285 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " "users." msgstr "" -#: judge/views/organization.py:252 +#: judge/views/organization.py:297 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "" -#: judge/views/organization.py:253 +#: judge/views/organization.py:298 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "" -#: judge/views/organization.py:283 +#: judge/views/organization.py:328 #, python-format msgid "Editing %s" msgstr "" -#: judge/views/organization.py:307 judge/views/organization.py:315 +#: judge/views/organization.py:352 judge/views/organization.py:360 msgid "Can't edit organization" msgstr "" -#: judge/views/organization.py:308 +#: judge/views/organization.py:353 msgid "You are not allowed to edit this organization." msgstr "" -#: judge/views/organization.py:316 +#: judge/views/organization.py:361 msgid "You are not allowed to kick people from this organization." msgstr "" -#: judge/views/organization.py:321 judge/views/organization.py:325 +#: judge/views/organization.py:366 judge/views/organization.py:370 msgid "Can't kick user" msgstr "" -#: judge/views/organization.py:322 +#: judge/views/organization.py:367 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:326 +#: judge/views/organization.py:371 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/problem.py:69 +#: judge/views/problem.py:68 msgid "No such problem" msgstr "沒有這個題目" -#: judge/views/problem.py:70 +#: judge/views/problem.py:69 #, python-format msgid "Could not find a problem with the code \"%s\"." msgstr "" -#: judge/views/problem.py:112 +#: judge/views/problem.py:111 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:115 +#: judge/views/problem.py:114 #, python-brace-format msgid "Editorial for {0}" msgstr "" -#: judge/views/problem.py:287 templates/contest/contest.html:79 -#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-about.html:28 templates/user/user-tabs.html:5 +#: templates/user/users-table.html:31 msgid "Problems" msgstr "問題" -#: judge/views/problem.py:564 +#: judge/views/problem.py:585 msgid "Banned from submitting" msgstr "" -#: judge/views/problem.py:565 +#: judge/views/problem.py:586 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "" -#: judge/views/problem.py:579 +#: judge/views/problem.py:600 msgid "Too many submissions" msgstr "" -#: judge/views/problem.py:580 +#: judge/views/problem.py:601 msgid "You have exceeded the submission limit for this problem." msgstr "" -#: judge/views/problem.py:640 judge/views/problem.py:643 +#: judge/views/problem.py:661 judge/views/problem.py:664 #, python-format msgid "Submit to %(problem)s" msgstr "" -#: judge/views/problem.py:658 +#: judge/views/problem.py:679 msgid "Clone Problem" msgstr "" @@ -2626,22 +2703,22 @@ msgstr "" msgid "Generated init.yml for %s" msgstr "" -#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#: judge/views/problem_manage.py:52 judge/views/problem_manage.py:55 #, python-format msgid "Managing submissions for %s" msgstr "" -#: judge/views/problem_manage.py:95 +#: judge/views/problem_manage.py:97 #, python-format msgid "Rejudging selected submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:110 +#: judge/views/problem_manage.py:141 #, python-format msgid "Rescoring all submissions for %s..." msgstr "" -#: judge/views/problem_manage.py:119 +#: judge/views/problem_manage.py:150 #, python-format msgid "Successfully scheduled %d submission for rejudging." msgid_plural "Successfully scheduled %d submissions for rejudging." @@ -2689,24 +2766,24 @@ msgstr "" msgid "Subscribe to newsletter?" msgstr "" -#: judge/views/register.py:45 +#: judge/views/register.py:55 #, python-format msgid "" "The email address \"%s\" is already taken. Only one registration is allowed " "per address." msgstr "" -#: judge/views/register.py:51 +#: judge/views/register.py:61 msgid "" "Your email provider is not allowed due to history of abuse. Please use a " "reputable email provider." msgstr "" -#: judge/views/register.py:57 judge/views/register.py:95 +#: judge/views/register.py:67 judge/views/register.py:105 msgid "Registration" msgstr "" -#: judge/views/register.py:106 +#: judge/views/register.py:116 msgid "Authentication failure" msgstr "" @@ -2722,13 +2799,13 @@ msgstr "" msgid "Version matrix" msgstr "" -#: judge/views/submission.py:83 judge/views/submission.py:90 +#: judge/views/submission.py:84 judge/views/submission.py:91 #, python-format msgid "Submission of %(problem)s by %(user)s" msgstr "" -#: judge/views/submission.py:247 judge/views/submission.py:248 -#: templates/problem/problem.html:127 +#: judge/views/submission.py:244 judge/views/submission.py:245 +#: templates/problem/problem.html:167 msgid "All submissions" msgstr "全部的提交" @@ -2782,10 +2859,6 @@ msgstr "" msgid "Ticket title" msgstr "" -#: judge/views/ticket.py:57 -msgid "Issue description" -msgstr "" - #: judge/views/ticket.py:107 judge/views/ticket.py:110 #, python-format msgid "New ticket for %s" @@ -2836,42 +2909,50 @@ msgstr "" msgid "Perform Two Factor Authentication" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 msgid "No such user" msgstr "" -#: judge/views/user.py:68 +#: judge/views/user.py:74 #, python-format msgid "No user handle \"%s\"." msgstr "" -#: judge/views/user.py:72 +#: judge/views/user.py:78 msgid "My account" msgstr "我的帳戶" -#: judge/views/user.py:73 +#: judge/views/user.py:79 #, python-format msgid "User %s" msgstr "用戶 %s" -#: judge/views/user.py:138 +#: judge/views/user.py:148 +msgid "M j, Y" +msgstr "" + +#: judge/views/user.py:171 msgid "M j, Y, G:i" msgstr "" -#: judge/views/user.py:236 +#: judge/views/user.py:290 msgid "Updated on site" msgstr "" -#: judge/views/user.py:269 templates/admin/auth/user/change_form.html:14 -#: templates/admin/auth/user/change_form.html:17 templates/base.html:237 +#: judge/views/user.py:323 templates/admin/auth/user/change_form.html:14 +#: templates/admin/auth/user/change_form.html:17 templates/base.html:238 #: templates/user/user-tabs.html:10 msgid "Edit profile" msgstr "" -#: judge/views/user.py:278 templates/user/user-list-tabs.html:4 +#: judge/views/user.py:332 templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "" +#: judge/views/user.py:407 +msgid "Import Users" +msgstr "" + #: judge/views/widgets.py:48 judge/views/widgets.py:58 #, python-format msgid "Invalid upstream data: %s" @@ -2909,7 +2990,7 @@ msgid "View Submissions" msgstr "" #: templates/admin/judge/problem/change_form.html:17 -#: templates/user/user-base.html:61 +#: templates/user/user-base.html:112 msgid "View submissions" msgstr "" @@ -2924,53 +3005,53 @@ msgstr "" msgid "Rejudge" msgstr "" -#: templates/base.html:229 +#: templates/base.html:230 #, python-format msgid "Hello, %(username)s." msgstr "" -#: templates/base.html:235 templates/comments/list.html:89 +#: templates/base.html:236 templates/comments/list.html:89 #: templates/contest/contest-list-tabs.html:24 -#: templates/contest/ranking-table.html:50 +#: templates/contest/ranking-table.html:53 #: 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:244 +#: templates/base.html:245 msgid "Log out" msgstr "登出" -#: templates/base.html:253 +#: templates/base.html:254 #: templates/registration/password_reset_complete.html:4 msgid "Log in" msgstr "" -#: templates/base.html:254 templates/registration/registration_form.html:177 +#: templates/base.html:255 templates/registration/registration_form.html:177 msgid "or" msgstr "" -#: templates/base.html:255 +#: templates/base.html:256 msgid "Sign up" msgstr "" -#: templates/base.html:270 +#: templates/base.html:271 msgid "spectating" msgstr "" -#: templates/base.html:283 +#: templates/base.html:284 msgid "This site works best with JavaScript enabled." msgstr "" -#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/blog/blog.html:13 templates/comments/list.html:68 #: templates/comments/list.html:83 templates/contest/contest-tabs.html:23 #: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3 #: templates/license.html:10 templates/problem/editorial.html:14 msgid "Edit" msgstr "" -#: templates/blog/content.html:27 +#: templates/blog/blog.html:26 #, python-format msgid "" "\n" @@ -2978,6 +3059,12 @@ msgid "" " " msgstr "" +#: templates/blog/content.html:10 +#, fuzzy, python-brace-format +#| msgid "posted time" +msgid "posted on {time}" +msgstr "發佈時間" + #: templates/blog/dashboard.html:21 #, python-format msgid "" @@ -2986,79 +3073,80 @@ msgid "" " " msgstr "" -#: templates/blog/list.html:97 +#: templates/blog/list.html:93 msgid "Blog" msgstr "" -#: templates/blog/list.html:99 +#: templates/blog/list.html:95 msgid "Events" msgstr "" -#: templates/blog/list.html:104 +#: templates/blog/list.html:100 msgid "News" msgstr "" -#: templates/blog/list.html:116 -#, fuzzy, python-brace-format -#| msgid "posted time" -msgid "posted on {time}" -msgstr "發佈時間" - -#: templates/blog/list.html:145 templates/problem/problem.html:316 +#: templates/blog/list.html:115 templates/problem/list.html:347 +#: templates/problem/problem.html:361 msgid "Clarifications" msgstr "" -#: templates/blog/list.html:161 templates/problem/problem.html:327 +#: templates/blog/list.html:121 +msgid "Add" +msgstr "" + +#: templates/blog/list.html:140 templates/problem/list.html:369 +#: templates/problem/problem.html:372 msgid "No clarifications have been made at this time." msgstr "" -#: templates/blog/list.html:169 +#: templates/blog/list.html:148 msgid "Ongoing contests" msgstr "" -#: templates/blog/list.html:187 +#: templates/blog/list.html:166 msgid "Upcoming contests" msgstr "" -#: templates/blog/list.html:205 +#: templates/blog/list.html:184 msgid "My open tickets" msgstr "" -#: templates/blog/list.html:227 +#: templates/blog/list.html:206 msgid "New tickets" msgstr "" -#: templates/blog/list.html:248 +#: templates/blog/list.html:227 msgid "New problems" msgstr "" -#: templates/blog/list.html:265 +#: templates/blog/list.html:244 msgid "Comment stream" msgstr "" -#: templates/chat/chat.html:234 +#: templates/chat/chat.html:305 msgid "Chat" msgstr "" -#: templates/chat/chat.html:236 templates/chat/chat.html:252 +#: templates/chat/chat.html:307 templates/chat/chat.html:314 #, fuzzy #| msgid "Online Judge" msgid "Online Users" msgstr "線上裁判" -#: templates/chat/chat.html:247 +#: templates/chat/chat.html:315 +msgid "Refresh" +msgstr "" + +#: templates/chat/chat.html:333 +msgid "Emoji" +msgstr "" + +#: templates/chat/chat.html:334 msgid "Enter your message" msgstr "" -#: templates/chat/chat.html:256 -msgid "Admins" -msgstr "" - -#: templates/chat/chat.html:270 templates/contest/contest.html:86 -#: templates/contest/list.html:153 templates/contest/list.html:195 -#: templates/contest/list.html:271 templates/problem/list.html:215 -#: templates/problem/list.html:246 -msgid "Users" +#: templates/chat/message.html:20 +msgid "Delete" msgstr "" #: templates/comments/list.html:2 @@ -3092,7 +3180,8 @@ msgstr "" msgid "Reply" msgstr "" -#: templates/comments/list.html:86 +#: templates/comments/list.html:86 templates/contest/list.html:91 +#: templates/contest/list.html:95 templates/contest/list.html:280 msgid "Hide" msgstr "" @@ -3180,6 +3269,11 @@ msgstr "星期五" msgid "Saturday" msgstr "星期六" +#: templates/contest/clarification.html:52 templates/organization/new.html:10 +#: templates/ticket/new.html:38 +msgid "Create" +msgstr "" + #: templates/contest/clone.html:37 msgid "Enter a new key for the cloned contest:" msgstr "" @@ -3211,7 +3305,7 @@ msgstr "" msgid "Calendar" msgstr "標準" -#: templates/contest/contest-tabs.html:4 +#: templates/contest/contest-tabs.html:4 templates/organization/home.html:105 msgid "Info" msgstr "" @@ -3224,7 +3318,7 @@ msgstr "" msgid "Rankings" msgstr "" -#: templates/contest/contest-tabs.html:13 +#: templates/contest/contest-tabs.html:16 msgid "Hidden Rankings" msgstr "" @@ -3236,29 +3330,28 @@ msgstr "" msgid "Clone" msgstr "" -#: templates/contest/contest-tabs.html:37 -#: templates/contest/contest-tabs.html:57 +#: templates/contest/contest-tabs.html:38 +#: templates/contest/contest-tabs.html:58 msgid "Leave contest" msgstr "" -#: templates/contest/contest-tabs.html:44 templates/contest/list.html:293 +#: templates/contest/contest-tabs.html:45 templates/contest/list.html:388 msgid "Virtual join" msgstr "" -#: templates/contest/contest-tabs.html:55 +#: templates/contest/contest-tabs.html:56 msgid "Stop spectating" msgstr "" -#: templates/contest/contest-tabs.html:64 +#: templates/contest/contest-tabs.html:65 msgid "Spectate contest" msgstr "" -#: templates/contest/contest-tabs.html:70 -#: templates/contest/contest-tabs.html:76 +#: templates/contest/contest-tabs.html:72 msgid "Join contest" msgstr "" -#: templates/contest/contest-tabs.html:85 +#: templates/contest/contest-tabs.html:81 msgid "Login to participate" msgstr "" @@ -3290,62 +3383,86 @@ msgstr "" msgid "AC Rate" msgstr "" -#: templates/contest/contest.html:111 templates/problem/list.html:322 +#: templates/contest/contest.html:86 templates/contest/list.html:237 +#: templates/contest/list.html:289 templates/contest/list.html:366 +#: templates/problem/list.html:223 templates/problem/list.html:254 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 templates/problem/list.html:330 msgid "Editorial" msgstr "" -#: templates/contest/list.html:31 templates/contest/media-js.html:9 +#: templates/contest/list.html:83 templates/contest/media-js.html:9 msgid "Are you sure you want to join?" msgstr "" -#: templates/contest/list.html:32 +#: templates/contest/list.html:84 msgid "" "Joining a contest for the first time starts your timer, after which it " "becomes unstoppable." msgstr "" -#: templates/contest/list.html:65 +#: templates/contest/list.html:92 templates/contest/list.html:278 +msgid "Show" +msgstr "" + +#: templates/contest/list.html:102 templates/problem/list.html:68 +#, fuzzy +#| msgid "Organization" +msgid "Organizations..." +msgstr "組織" + +#: templates/contest/list.html:135 msgid "hidden" msgstr "" -#: templates/contest/list.html:70 +#: templates/contest/list.html:140 msgid "private" msgstr "" -#: templates/contest/list.html:84 +#: templates/contest/list.html:154 msgid "rated" msgstr "" -#: templates/contest/list.html:132 +#: templates/contest/list.html:202 msgid "Spectate" msgstr "" -#: templates/contest/list.html:138 +#: templates/contest/list.html:208 msgid "Join" msgstr "" -#: templates/contest/list.html:148 +#: templates/contest/list.html:220 +msgid "Search contests..." +msgstr "" + +#: templates/contest/list.html:229 +msgid "Search" +msgstr "" + +#: templates/contest/list.html:232 msgid "Active Contests" msgstr "" -#: templates/contest/list.html:152 templates/contest/list.html:194 -#: templates/contest/list.html:232 templates/contest/list.html:270 +#: templates/contest/list.html:236 templates/contest/list.html:288 +#: templates/contest/list.html:327 templates/contest/list.html:365 msgid "Contest" msgstr "" -#: templates/contest/list.html:190 +#: templates/contest/list.html:275 msgid "Ongoing Contests" msgstr "" -#: templates/contest/list.html:227 +#: templates/contest/list.html:322 msgid "Upcoming Contests" msgstr "" -#: templates/contest/list.html:255 +#: templates/contest/list.html:350 msgid "There are no scheduled contests at this time." msgstr "" -#: templates/contest/list.html:261 +#: templates/contest/list.html:356 msgid "Past Contests" msgstr "" @@ -3396,15 +3513,19 @@ msgstr "" msgid "Only the following organizations may access this contest:" msgstr "" -#: templates/contest/ranking-table.html:9 +#: templates/contest/ranking-table.html:9 templates/problem/search-form.html:35 msgid "Organization" msgstr "組織" -#: templates/contest/ranking-table.html:41 -msgid "Un-Disqualify" +#: templates/contest/ranking-table.html:10 templates/user/users-table.html:13 +msgid "Full Name" msgstr "" #: templates/contest/ranking-table.html:44 +msgid "Un-Disqualify" +msgstr "" + +#: templates/contest/ranking-table.html:47 msgid "Disqualify" msgstr "" @@ -3416,41 +3537,49 @@ msgstr "" msgid "Are you sure you want to un-disqualify this participation?" msgstr "" -#: templates/contest/ranking.html:353 +#: templates/contest/ranking.html:463 msgid "View user participation" msgstr "" -#: templates/contest/ranking.html:357 +#: templates/contest/ranking.html:467 msgid "Show organizations" msgstr "" -#: templates/contest/ranking.html:361 +#: templates/contest/ranking.html:471 msgid "Show full name" msgstr "" -#: templates/contest/ranking.html:364 +#: templates/contest/ranking.html:474 msgid "Show friends only" msgstr "" -#: templates/contest/ranking.html:367 +#: templates/contest/ranking.html:477 msgid "Total score only" msgstr "" -#: templates/contest/stats.html:38 +#: templates/contest/ranking.html:479 +msgid "Show virtual participation" +msgstr "" + +#: templates/contest/stats.html:51 msgid "Problem Status Distribution" msgstr "" -#: templates/contest/stats.html:43 +#: templates/contest/stats.html:56 #, fuzzy #| msgid "Problem name" msgid "Problem AC Rate" msgstr "題目名稱" -#: templates/contest/stats.html:48 templates/stats/language.html:16 +#: templates/contest/stats.html:62 +msgid "Problem Point Distribution" +msgstr "" + +#: templates/contest/stats.html:76 templates/stats/language.html:16 msgid "Submissions by Language" msgstr "" -#: templates/contest/stats.html:54 templates/stats/language.html:26 +#: templates/contest/stats.html:82 templates/stats/language.html:26 msgid "Language AC Rate" msgstr "" @@ -3561,58 +3690,85 @@ msgstr "" msgid "Update" msgstr "" -#: templates/organization/home.html:7 +#: templates/organization/home.html:41 msgid "Are you sure you want to leave this organization?" msgstr "" -#: templates/organization/home.html:9 +#: templates/organization/home.html:43 msgid "You will have to rejoin to show up on the organization leaderboard." msgstr "" -#: templates/organization/home.html:11 +#: templates/organization/home.html:45 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 +#: templates/organization/home.html:88 msgid "Join organization" msgstr "" -#: templates/organization/home.html:33 +#: templates/organization/home.html:92 msgid "Request membership" msgstr "" -#: templates/organization/home.html:39 +#: templates/organization/home.html:122 +#, fuzzy +#| msgid "Organization" +msgid "Organization news" +msgstr "組織" + +#: templates/organization/home.html:128 +msgid "There is no news at this time." +msgstr "" + +#: templates/organization/home.html:137 +msgid "Controls" +msgstr "" + +#: templates/organization/home.html:142 msgid "Edit organization" msgstr "" -#: templates/organization/home.html:43 +#: templates/organization/home.html:148 msgid "View requests" msgstr "" -#: templates/organization/home.html:50 +#: templates/organization/home.html:161 msgid "Admin organization" msgstr "" -#: templates/organization/home.html:55 +#: templates/organization/home.html:167 msgid "View members" msgstr "" -#: templates/organization/list.html:23 templates/status/language-list.html:34 +#: templates/organization/home.html:174 +msgid "Leave organization" +msgstr "" + +#: templates/organization/home.html:183 +msgid "New private contests" +msgstr "" + +#: templates/organization/home.html:193 templates/organization/home.html:208 +msgid "View all" +msgstr "" + +#: templates/organization/home.html:199 +msgid "New private problems" +msgstr "" + +#: templates/organization/list.html:40 +msgid "Show my organizations only" +msgstr "" + +#: templates/organization/list.html:47 templates/status/language-list.html:34 +#: templates/user/import/table_csv.html:6 msgid "Name" msgstr "" -#: templates/organization/list.html:24 +#: templates/organization/list.html:48 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 "" @@ -3645,7 +3801,7 @@ msgid "There are no requests to approve." msgstr "" #: templates/organization/requests/pending.html:17 -#: templates/problem/data.html:475 +#: templates/problem/data.html:432 msgid "Delete?" msgstr "" @@ -3681,37 +3837,37 @@ msgstr "" msgid "Enter a new code for the cloned problem:" msgstr "" -#: templates/problem/data.html:108 +#: templates/problem/data.html:119 #, fuzzy #| msgid "solution" msgid "Instruction" msgstr "題解" -#: templates/problem/data.html:433 +#: templates/problem/data.html:390 msgid "View YAML" msgstr "" -#: templates/problem/data.html:464 templates/problem/data.html:514 +#: templates/problem/data.html:421 templates/problem/data.html:472 msgid "Apply!" msgstr "" -#: templates/problem/data.html:469 +#: templates/problem/data.html:426 msgid "Type" msgstr "" -#: templates/problem/data.html:470 +#: templates/problem/data.html:427 msgid "Input file" msgstr "" -#: templates/problem/data.html:471 +#: templates/problem/data.html:428 msgid "Output file" msgstr "" -#: templates/problem/data.html:473 +#: templates/problem/data.html:430 msgid "Pretest?" msgstr "" -#: templates/problem/data.html:515 +#: templates/problem/data.html:473 msgid "Add new case" msgstr "" @@ -3723,28 +3879,32 @@ msgid "" "problem yourself is a bannable offence.
" msgstr "" -#: templates/problem/list.html:62 +#: templates/problem/list.html:66 msgid "Filter by type..." msgstr "" -#: templates/problem/list.html:185 +#: templates/problem/list.html:193 msgid "Hot problems" msgstr "" -#: templates/problem/list.html:210 templates/problem/list.html:232 -#: templates/problem/search-form.html:35 templates/user/user-problems.html:57 +#: templates/problem/list.html:218 templates/problem/list.html:240 +#: templates/problem/search-form.html:45 templates/user/user-problems.html:57 msgid "Category" msgstr "" -#: templates/problem/list.html:212 templates/problem/list.html:236 +#: templates/problem/list.html:220 templates/problem/list.html:244 msgid "Types" msgstr "" -#: templates/problem/list.html:243 +#: templates/problem/list.html:251 #, python-format msgid "AC %%" msgstr "" +#: templates/problem/list.html:342 +msgid "Add clarifications" +msgstr "" + #: templates/problem/manage_submission.html:55 msgid "Leave empty to not filter by language" msgstr "" @@ -3753,194 +3913,199 @@ msgstr "" msgid "Leave empty to not filter by result" msgstr "" -#: templates/problem/manage_submission.html:79 +#: templates/problem/manage_submission.html:80 msgid "Need valid values for both start and end IDs." msgstr "" -#: templates/problem/manage_submission.html:82 +#: templates/problem/manage_submission.html:83 msgid "End ID must be after start ID." msgstr "" -#: templates/problem/manage_submission.html:90 +#: templates/problem/manage_submission.html:96 #, python-brace-format msgid "" -"You are about to rejudge {count} submissions. Are you sure you want to do " +"You are about to {action} {count} submissions. Are you sure you want to do " "this?" msgstr "" -#: templates/problem/manage_submission.html:96 +#: templates/problem/manage_submission.html:103 +#, python-brace-format 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:" +"You are about to {action} a few submissions. Are you sure you want to do " +"this?" msgstr "" #: templates/problem/manage_submission.html:127 +#: templates/submission/list.html:309 +msgid "Filter submissions" +msgstr "" + +#: templates/problem/manage_submission.html:132 +msgid "Filter by ID:" +msgstr "" + +#: templates/problem/manage_submission.html:135 +msgid "Starting ID:" +msgstr "" + +#: templates/problem/manage_submission.html:139 msgid "Ending ID:" msgstr "" -#: templates/problem/manage_submission.html:131 +#: templates/problem/manage_submission.html:143 msgid "This range includes both endpoints." msgstr "" -#: templates/problem/manage_submission.html:134 +#: templates/problem/manage_submission.html:146 msgid "Filter by language:" msgstr "" -#: templates/problem/manage_submission.html:142 +#: templates/problem/manage_submission.html:154 msgid "Filter by result:" msgstr "" -#: templates/problem/manage_submission.html:150 +#: templates/problem/manage_submission.html:164 +#, fuzzy +#| msgid "location" +msgid "Action" +msgstr "位置" + +#: templates/problem/manage_submission.html:166 msgid "Rejudge selected submissions" msgstr "" -#: templates/problem/manage_submission.html:157 -msgid "Rescore Everything" -msgstr "" +#: templates/problem/manage_submission.html:171 +#, fuzzy +#| msgid "All submissions" +msgid "Download selected submissions" +msgstr "全部的提交" -#: templates/problem/manage_submission.html:158 -#, python-format -msgid "This will rescore %(count)d submissions." -msgstr "" - -#: templates/problem/manage_submission.html:162 +#: templates/problem/manage_submission.html:177 #, python-format msgid "Are you sure you want to rescore %(count)d submissions?" msgstr "" -#: templates/problem/manage_submission.html:163 +#: templates/problem/manage_submission.html:178 msgid "Rescore all submissions" msgstr "" -#: templates/problem/problem.html:91 +#: templates/problem/problem.html:132 msgid "View as PDF" msgstr "" -#: templates/problem/problem.html:101 templates/problem/problem.html:111 -#: templates/problem/problem.html:116 +#: templates/problem/problem.html:141 templates/problem/problem.html:151 +#: templates/problem/problem.html:156 msgid "Submit solution" msgstr "" -#: templates/problem/problem.html:104 +#: templates/problem/problem.html:144 #, python-format msgid "%(counter)s submission left" msgid_plural "%(counter)s submissions left" msgstr[0] "" -#: templates/problem/problem.html:112 +#: templates/problem/problem.html:152 msgid "0 submissions left" msgstr "" -#: templates/problem/problem.html:124 +#: templates/problem/problem.html:164 msgid "My submissions" msgstr "" -#: templates/problem/problem.html:128 +#: templates/problem/problem.html:168 msgid "Best submissions" msgstr "" -#: templates/problem/problem.html:131 -#, fuzzy -#| msgid "All submissions" -msgid "Download AC submissions" -msgstr "全部的提交" - -#: templates/problem/problem.html:138 +#: templates/problem/problem.html:172 msgid "Read editorial" msgstr "" -#: templates/problem/problem.html:143 +#: templates/problem/problem.html:177 msgid "Manage tickets" msgstr "" -#: templates/problem/problem.html:147 +#: templates/problem/problem.html:181 msgid "Edit problem" msgstr "" -#: templates/problem/problem.html:149 +#: templates/problem/problem.html:183 msgid "Edit test data" msgstr "" -#: templates/problem/problem.html:154 +#: templates/problem/problem.html:188 msgid "My tickets" msgstr "" -#: templates/problem/problem.html:162 +#: templates/problem/problem.html:196 msgid "Manage submissions" msgstr "" -#: templates/problem/problem.html:168 +#: templates/problem/problem.html:202 msgid "Clone problem" msgstr "" -#: templates/problem/problem.html:175 +#: templates/problem/problem.html:209 msgid "Points:" msgstr "" -#: templates/problem/problem.html:178 templates/problem/problem.html:180 +#: templates/problem/problem.html:212 templates/problem/problem.html:214 msgid "(partial)" msgstr "" -#: templates/problem/problem.html:185 +#: templates/problem/problem.html:219 msgid "Time limit:" msgstr "時間限制:" -#: templates/problem/problem.html:197 +#: templates/problem/problem.html:231 msgid "Memory limit:" msgstr "記憶體限制:" -#: templates/problem/problem.html:216 +#: templates/problem/problem.html:250 msgid "Author:" msgid_plural "Authors:" msgstr[0] "作者:" -#: templates/problem/problem.html:231 +#: templates/problem/problem.html:265 msgid "Problem type" msgid_plural "Problem types" msgstr[0] "題目類型" -#: templates/problem/problem.html:244 +#: templates/problem/problem.html:278 msgid "Allowed languages" msgstr "允許的語言" -#: templates/problem/problem.html:252 +#: templates/problem/problem.html:286 #, python-format msgid "No %(lang)s judge online" msgstr "" -#: templates/problem/problem.html:263 +#: templates/problem/problem.html:297 msgid "Judge:" msgid_plural "Judges:" msgstr[0] "" -#: templates/problem/problem.html:280 +#: templates/problem/problem.html:314 msgid "none available" msgstr "" -#: templates/problem/problem.html:305 +#: templates/problem/problem.html:326 +#, python-format +msgid "This problem has %(length)s clarification(s)" +msgstr "" + +#: templates/problem/problem.html:350 msgid "Request clarification" msgstr "" -#: templates/problem/problem.html:307 +#: templates/problem/problem.html:352 msgid "Report an issue" msgstr "" -#: templates/problem/raw.html:62 +#: templates/problem/raw.html:64 msgid "Time Limit:" msgstr "" -#: templates/problem/raw.html:71 +#: templates/problem/raw.html:73 msgid "Memory Limit:" msgstr "" @@ -3968,25 +4133,25 @@ msgstr "" msgid "Show editorial" msgstr "" -#: templates/problem/search-form.html:38 templates/problem/search-form.html:40 +#: templates/problem/search-form.html:48 templates/problem/search-form.html:50 #: templates/submission/submission-list-tabs.html:4 msgid "All" msgstr "" -#: templates/problem/search-form.html:51 +#: templates/problem/search-form.html:62 msgid "Problem types" msgstr "" -#: templates/problem/search-form.html:62 +#: templates/problem/search-form.html:73 msgid "Point range" msgstr "" -#: templates/problem/search-form.html:68 templates/submission/list.html:331 +#: templates/problem/search-form.html:79 templates/submission/list.html:331 #: templates/ticket/list.html:248 msgid "Go" msgstr "" -#: templates/problem/search-form.html:69 +#: templates/problem/search-form.html:80 msgid "Random" msgstr "" @@ -4152,20 +4317,20 @@ msgstr "" msgid "Affiliated organizations" msgstr "" -#: templates/registration/registration_form.html:192 +#: templates/registration/registration_form.html:195 #: templates/user/edit-profile.html:128 msgid "Notify me about upcoming contests" msgstr "" -#: templates/registration/registration_form.html:206 +#: templates/registration/registration_form.html:209 msgid "By registering, you agree to our" msgstr "" -#: templates/registration/registration_form.html:207 +#: templates/registration/registration_form.html:210 msgid "Terms & Conditions" msgstr "" -#: templates/registration/registration_form.html:210 +#: templates/registration/registration_form.html:213 msgid "Register!" msgstr "" @@ -4223,6 +4388,7 @@ msgid "Ping" msgstr "" #: templates/status/judge-status-table.html:8 +#: templates/user/import/index.html:104 msgid "Load" msgstr "" @@ -4238,6 +4404,7 @@ msgid "There are no judges available at this time." msgstr "" #: templates/status/language-list.html:33 templates/ticket/list.html:261 +#: templates/user/import/table_csv.html:3 msgid "ID" msgstr "" @@ -4253,6 +4420,14 @@ msgstr "" msgid "Version Matrix" msgstr "" +#: templates/submission/internal-error-message.html:3 +#, python-format +msgid "" +"An internal error occurred while grading, and the %(SITE_NAME)s " +"administrators have been notified.
In the meantime, try resubmitting in " +"a few seconds." +msgstr "" + #: templates/submission/internal-error-message.html:8 msgid "An internal error occurred while grading." msgstr "" @@ -4269,10 +4444,6 @@ msgstr "" msgid "Filter by language..." msgstr "" -#: templates/submission/list.html:309 -msgid "Filter submissions" -msgstr "" - #: templates/submission/list.html:345 msgid "Total:" msgstr "" @@ -4329,73 +4500,74 @@ msgstr "" msgid "Execution Results" msgstr "" -#: templates/submission/status-testcases.html:31 -msgid "Batch " -msgstr "" - -#: templates/submission/status-testcases.html:43 +#: templates/submission/status-testcases.html:34 msgid "Overall: " msgstr "" -#: templates/submission/status-testcases.html:57 +#: templates/submission/status-testcases.html:48 #, fuzzy #| msgid "Points" msgid "Point: " msgstr "分數" -#: templates/submission/status-testcases.html:62 +#: templates/submission/status-testcases.html:53 #, fuzzy #| msgid "Time" msgid "Time: " msgstr "時間" -#: templates/submission/status-testcases.html:71 +#: templates/submission/status-testcases.html:62 #, fuzzy #| msgid "Memory" msgid "Memory: " msgstr "記憶體" +#: templates/submission/status-testcases.html:73 +msgid "Batch " +msgstr "" + #: templates/submission/status-testcases.html:84 -msgid "Case" -msgstr "" - -#: templates/submission/status-testcases.html:86 -msgid "Pretest" -msgstr "" - -#: templates/submission/status-testcases.html:88 -msgid "Test case" -msgstr "" - -#: templates/submission/status-testcases.html:99 +#: templates/submission/status-testcases.html:113 #, fuzzy #| msgid "Points" msgid "Point" msgstr "分數" -#: templates/submission/status-testcases.html:121 +#: templates/submission/status-testcases.html:99 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:101 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:103 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:141 msgid "Input:" msgstr "" -#: templates/submission/status-testcases.html:125 +#: templates/submission/status-testcases.html:145 msgid "Output:" msgstr "" -#: templates/submission/status-testcases.html:129 +#: templates/submission/status-testcases.html:149 #, fuzzy #| msgid "Wrong Answer" msgid "Answer:" msgstr "錯誤答案" -#: templates/submission/status-testcases.html:134 +#: templates/submission/status-testcases.html:154 msgid "Judge feedback:" msgstr "" -#: templates/submission/status-testcases.html:157 +#: templates/submission/status-testcases.html:175 msgid "Passing pretests does not guarantee a full score on system tests." msgstr "" -#: templates/submission/status-testcases.html:160 +#: templates/submission/status-testcases.html:178 msgid "Submission aborted!" msgstr "" @@ -4420,11 +4592,11 @@ msgstr "" msgid "%(user)s's" msgstr "" -#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +#: templates/ticket/list.html:135 templates/ticket/ticket.html:273 msgid "Reopened: " msgstr "" -#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +#: templates/ticket/list.html:138 templates/ticket/ticket.html:274 msgid "Closed: " msgstr "" @@ -4448,7 +4620,7 @@ msgstr "" msgid "Title" msgstr "" -#: templates/ticket/list.html:264 templates/ticket/ticket.html:328 +#: templates/ticket/list.html:264 templates/ticket/ticket.html:369 msgid "Assignees" msgstr "" @@ -4463,34 +4635,34 @@ msgid "" "a problem, ask in the comments instead." msgstr "" -#: templates/ticket/ticket.html:322 +#: templates/ticket/ticket.html:355 +msgid "Post" +msgstr "" + +#: templates/ticket/ticket.html:363 msgid "Associated object" msgstr "" -#: templates/ticket/ticket.html:333 +#: templates/ticket/ticket.html:374 msgid "No one is assigned." msgstr "" -#: templates/ticket/ticket.html:339 +#: templates/ticket/ticket.html:380 msgid "Close ticket" msgstr "" -#: templates/ticket/ticket.html:341 +#: templates/ticket/ticket.html:382 msgid "Reopen ticket" msgstr "" -#: templates/ticket/ticket.html:345 +#: templates/ticket/ticket.html:386 msgid "Assignee notes" msgstr "" -#: templates/ticket/ticket.html:352 templates/widgets/select_all.html:4 +#: templates/ticket/ticket.html:393 templates/widgets/select_all.html:4 msgid "Nothing here." msgstr "" -#: templates/ticket/ticket.html:385 -msgid "Post" -msgstr "" - #: templates/user/base-users-table.html:3 msgid "Rank" msgstr "" @@ -4539,6 +4711,28 @@ msgstr "" msgid "Update profile" msgstr "" +#: templates/user/import/index.html:31 +msgid "Upload CSV only" +msgstr "" + +#: templates/user/import/index.html:100 +#, fuzzy +#| msgid "user profile" +msgid "User File" +msgstr "使用者個人檔案" + +#: templates/user/import/index.html:102 +msgid "Sample" +msgstr "" + +#: templates/user/import/index.html:105 templates/user/user-list-tabs.html:8 +msgid "Import" +msgstr "" + +#: templates/user/import/table_csv.html:7 +msgid "School" +msgstr "" + #: templates/user/pp-row.html:22 #, python-format msgid "" @@ -4557,61 +4751,144 @@ msgstr "" msgid "%(pp).0fpp" msgstr "" -#: templates/user/user-about.html:18 -msgid "Unfollow" -msgstr "" - -#: templates/user/user-about.html:21 -msgid "Follow" -msgstr "" - -#: templates/user/user-about.html:28 -msgid "From" -msgstr "" - -#: templates/user/user-about.html:39 -msgid "Admin Notes" -msgstr "" - -#: templates/user/user-about.html:54 -msgid "You have not shared any information." -msgstr "" - -#: templates/user/user-about.html:56 -msgid "This user has not shared any information." -msgstr "" - -#: templates/user/user-base.html:42 +#: templates/user/user-about.html:23 #, 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:" +#: templates/user/user-about.html:35 +#, fuzzy +#| msgid "points" +msgid "Total points" +msgstr "分" + +#: templates/user/user-about.html:45 +#, fuzzy +#| msgid "Rating" +msgid "Rank by rating" +msgstr "評分" + +#: templates/user/user-about.html:52 +#, fuzzy +#| msgid "points" +msgid "Rank by points" +msgstr "分" + +#: templates/user/user-about.html:64 +msgid "From" msgstr "" -#: templates/user/user-base.html:53 -msgid "Total points:" +#: templates/user/user-about.html:75 +msgid "Admin Notes" msgstr "" -#: templates/user/user-base.html:68 -msgid "Rank by rating:" +#: templates/user/user-about.html:90 +msgid "You have not shared any information." msgstr "" -#: templates/user/user-base.html:70 -msgid "Rating:" +#: templates/user/user-about.html:92 +msgid "This user has not shared any information." msgstr "" -#: templates/user/user-base.html:71 +#: templates/user/user-about.html:101 +msgid "Awards" +msgstr "" + +#: templates/user/user-about.html:112 +#, python-format +msgid "%(label)s (%(date)s)" +msgstr "" + +#: templates/user/user-about.html:130 +#, fuzzy +#| msgid "Monday" +msgid "Mon" +msgstr "星期一" + +#: templates/user/user-about.html:135 +#, fuzzy +#| msgid "Tuesday" +msgid "Tues" +msgstr "星期二" + +#: templates/user/user-about.html:140 +msgid "Wed" +msgstr "" + +#: templates/user/user-about.html:145 +#, fuzzy +#| msgid "Thursday" +msgid "Thurs" +msgstr "星期四" + +#: templates/user/user-about.html:150 +#, fuzzy +#| msgid "Friday" +msgid "Fri" +msgstr "星期五" + +#: templates/user/user-about.html:155 +msgid "Sat" +msgstr "" + +#: templates/user/user-about.html:160 +#, fuzzy +#| msgid "Sunday" +msgid "Sun" +msgstr "星期日" + +#: templates/user/user-about.html:169 +msgid "Less" +msgstr "" + +#: templates/user/user-about.html:175 +msgid "More" +msgstr "" + +#: templates/user/user-about.html:184 +#, fuzzy +#| msgid "History" +msgid "Rating History" +msgstr "歷史記錄" + +#: templates/user/user-about.html:255 +msgid "past year" +msgstr "" + +#: templates/user/user-about.html:272 +#, fuzzy +#| msgid "All submissions" +msgid "total submission(s)" +msgstr "全部的提交" + +#: templates/user/user-about.html:276 +#, fuzzy +#| msgid "submission time" +msgid "submissions in the last year" +msgstr "提交時間" + +#: templates/user/user-base.html:101 +msgid "Unfollow" +msgstr "" + +#: templates/user/user-base.html:104 +msgid "Follow" +msgstr "" + +#: templates/user/user-base.html:120 +msgid "Contests written" +msgstr "" + +#: templates/user/user-base.html:124 msgid "Volatility:" msgstr "" -#: templates/user/user-base.html:72 +#: templates/user/user-base.html:128 msgid "Min. rating:" msgstr "" -#: templates/user/user-base.html:73 +#: templates/user/user-base.html:132 msgid "Max rating:" msgstr "" diff --git a/locale/zh_Hant/LC_MESSAGES/djangojs.po b/locale/zh_Hant/LC_MESSAGES/djangojs.po index 42e679b..832032c 100644 --- a/locale/zh_Hant/LC_MESSAGES/djangojs.po +++ b/locale/zh_Hant/LC_MESSAGES/djangojs.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: dmoj\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"POT-Creation-Date: 2021-07-20 23:30+0700\n" "PO-Revision-Date: 2019-11-11 22:05\n" "Last-Translator: Icyene\n" "Language-Team: Chinese Traditional\n" @@ -26,4 +26,3 @@ msgstr[0] "%d 天 %h:%m:%s" msgctxt "time format without day" msgid "%h:%m:%s" msgstr "%h:%m:%s" - diff --git a/logo.png b/logo.png index 5da8ac0..4e1a813 100644 Binary files a/logo.png and b/logo.png differ diff --git a/requirements.txt b/requirements.txt index 735c38a..18eb9a3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ django-impersonate -e git://github.com/DMOJ/dmoj-wpadmin.git#egg=dmoj-wpadmin lxml Pygments -mistune +mistune<2 social-auth-app-django pytz django-statici18n @@ -30,10 +30,9 @@ packaging celery -e git://github.com/DMOJ/ansi2html.git#egg=ansi2html sqlparse -channels==2.4.0 -channels-redis==2.4.2 -docker django-newsletter -python-memcached netaddr redis +lupa +websocket-client +python-memcached \ No newline at end of file diff --git a/resources/awards/bronze-medal.png b/resources/awards/bronze-medal.png new file mode 100644 index 0000000..3a6f63f Binary files /dev/null and b/resources/awards/bronze-medal.png differ diff --git a/resources/awards/gold-medal.png b/resources/awards/gold-medal.png new file mode 100644 index 0000000..4b5bb05 Binary files /dev/null and b/resources/awards/gold-medal.png differ diff --git a/resources/awards/medals.png b/resources/awards/medals.png new file mode 100644 index 0000000..d193ff0 Binary files /dev/null and b/resources/awards/medals.png differ diff --git a/resources/awards/silver-medal.png b/resources/awards/silver-medal.png new file mode 100644 index 0000000..9d91ac0 Binary files /dev/null and b/resources/awards/silver-medal.png differ diff --git a/resources/base.scss b/resources/base.scss index 15107b9..0b316fc 100644 --- a/resources/base.scss +++ b/resources/base.scss @@ -181,7 +181,7 @@ header { } a { - color: #9c3706; + color: lightcoral; } li { @@ -291,7 +291,7 @@ nav { &:hover { border-top: 2px solid #9c3706; - color: #9c3706; + color: lightcoral; background: rgba(255, 255, 255, 0.25); margin: 0; } @@ -314,7 +314,7 @@ nav { left: 5px; display: none; color: #fff; - background: #00c4cc; + background: darkcyan; margin: 0 !important; box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); @@ -329,6 +329,10 @@ nav { li { display: block; + a { + color: white !important; + } + a, button { padding: 8px 20px 8px 8px !important; font-size: 0.8em; @@ -680,12 +684,31 @@ math { } #notification { - color: gray; + color: lightsteelblue; float: left; - margin-top: 0.8em; + margin-top: 0.6em; margin-right: 0.8em; font-size: 1.3em; } + +#chat-icon { + color: lightseagreen; + float: left; + margin-top: 0.6em; + margin-right: 0.5em; + font-size: 1.3em; +} + +.unread_boxes { + background-color: red; + color: white; + border-radius: 50%; + padding: 1px 4px; + margin-left: -12px; + font-size: x-small; + font-family: monospace; +} + @media (max-width: 500px) { #notification { margin-top: 0.6em; diff --git a/resources/chatbox.scss b/resources/chatbox.scss index 52eda9c..128b04f 100644 --- a/resources/chatbox.scss +++ b/resources/chatbox.scss @@ -1,137 +1,183 @@ - -#loader { - display: block; - margin-left: auto; - margin-right: auto; - width: 4%; +#chat-log p { + margin: 0; + padding-top: 0.1em; + padding-bottom: 0.1em; +} +.chatbtn_remove_mess { + float: right; + margin-right: 1em; +} +#emoji-button { + position: absolute; + right: 1em; + font-size: 2em; + color: lightgray; +} +#emoji-button:hover { + color: gray; } - #chat-log { padding: 0; padding-top: 2em; width: 100%; + font-size: 14px; } - #chat-log li { list-style-type: none; margin: 0.5em; } - - #chat-submit { margin-top: 1em; } - -.profile-pic { - height: 2.6em; - width: 2.6em; - border-radius: 0.3em; - margin-top: 0.1em; - float: left; -} - -.body-message { - padding-left: 3em; - padding-bottom: 1em; - border-bottom: 1px solid lightgray; -} - -.user-time { - margin-bottom: 0.3em; -} - -.time { - margin-left: 0.5em; -} - -.user { - font-weight: bold; -} - -.clear { - clear: both; -} -.content-message { - word-wrap: break-word; - white-space: pre-line; -} - - -#chat-area { - height: 85vh; - /*display: flex;*/ - /*flex-direction: column;*/ +.big-emoji { + font-size: 16px; } #chat-online { - border: 1px solid #ccc; - border-radius: 4px; - overflow: hidden; - overflow-wrap: break-word; - overflow-y: scroll; - max-height: 81vh; + border-right: 1px solid #ccc; + padding-bottom: 0 !important; + min-width: 25%; + border-bottom: 0; } #chat-online-content { + margin-top: 0.5em; + margin-bottom: 0; + overflow: hidden; + overflow-wrap: break-word; + overflow-y: auto; + max-height: 77vh; } - #chat-box { - border: 1px solid #ccc; - border-radius: 4px; + /*border: 1px solid #ccc;*/ + /*border-top-right-radius: 4px;*/ width: 100%; overflow: hidden; overflow-wrap: break-word; overflow-y: scroll; border-bottom-left-radius: 0; border-bottom-right-radius: 0; - max-height: 85%; - height: auto; + height: 75%; } #chat-input { - width: 100.3%; + width: 100%; padding: 0.4em; + padding-bottom: 0.6em; + border: 0; color: black; - font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif; border-top-left-radius: 0; border-top-right-radius: 0; - height: 15%; + height: 100%; + font-size: 14px; } - #chat-online-content { padding: 0; width: 100%; } - -.green-dot, .red-dot { - height: 0.8em; - width: 0.8em; - border-radius: 50%; - display: inline-block; - margin-bottom: -0.15em; -} -.green-dot { - background-color: #42f58d; -} - -.red-dot { - background-color: red; -} - @media (min-width: 800px) { #chat-container { display: flex; width: 100%; - } - #chat-box { - + height: 90vh; + border: 1px solid #ccc; + /*border-radius: 0 4px 0 0;*/ + border-bottom: 0; } #chat-online { - margin-left: auto; - width: 22%; - } - #chat-area { - width: 75%; + margin: 0; } .chat-left-panel, .chat-right-panel { display: block !important; } -} \ No newline at end of file +} +#chat-input, #chat-log .content-message { + font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif; +} +.info-pic { + height: 90%; + border-radius: 50%; + padding: 0.05em; + border: 0.1px solid #ccc; + margin-left: 3em; + margin-bottom: 1.5px; +} +.info-circle { + position: absolute; + cx: 86%; + cy: 80%; + r: 6px; + stroke: white; + stroke-width: 1; +} +.info-name { + margin-left: 10px; + font-size: 2em; + font-weight: bold !important; + display: flex; +} +.info-name a { + display: table-caption; +} +#chat-info { + border-bottom: 2px solid darkgray; + display: flex; +} +#refresh-button { + padding: 0; + margin-left: auto; + margin-right: 0.3em; + background: transparent; + border: none; + height: 1.5em; + width: 1.5em; +} +#refresh-button:hover { + background: lightgreen; + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + transition: 1.5s ease-in-out; +} +.status-pic { + height: 1.3em; + width: 1.3em; + border-radius: 0.3em; +} +.status-container { + position: relative; + display: inline-flex; +} +.status-circle { + position: absolute; + bottom: 0; + right: 0; + cx: 18px; + cy: 18px; + r: 4.5px; + stroke: white; + stroke-width: 1; +} +.status-row { + display: flex; + font-size: 15px; + padding: 0.2em 0.2em 0.2em 1em; + border-radius: 4px; +} +.status-row:hover { + background: lightgray; + cursor: pointer; +} +.status-list { + padding: 0; +} +.status-section-title { + cursor: pointer; + margin-top: 0.5em; +} + +@media (max-width: 799px) { + #chat-area { + height: 500px; + } + #emoji-button { + display: none; + } +} diff --git a/resources/common.js b/resources/common.js index 04e8ebe..1fed1ce 100644 --- a/resources/common.js +++ b/resources/common.js @@ -183,8 +183,7 @@ if (!Date.now) { } function count_down(label) { - var initial = parseInt(label.attr('data-secs')); - var start = Date.now(); + var end_time = new Date(label.attr('data-secs').replace(' ', 'T')); function format(num) { var s = "0" + num; @@ -192,7 +191,7 @@ function count_down(label) { } var timer = setInterval(function () { - var time = Math.round(initial - (Date.now() - start) / 1000); + var time = Math.round((end_time - Date.now()) / 1000); if (time <= 0) { clearInterval(timer); setTimeout(function() { @@ -212,8 +211,9 @@ function count_down(label) { }, 1000); } -function register_time(elems, limit) { - limit = limit || 300; +function register_time(elems, limit) { // in hours + if ('limit_time' in window) limit = window.limit_time; + else limit = limit || 300 * 24; elems.each(function () { var outdated = false; var $this = $(this); @@ -225,7 +225,7 @@ function register_time(elems, limit) { if ($('body').hasClass('window-hidden')) return outdated = true; outdated = false; - if (moment().diff(time, 'days') > limit) { + if (moment().diff(time, 'hours') > limit) { $this.text(abs); return; } @@ -322,6 +322,36 @@ window.register_notify = function (type, options) { status_change(); }; +window.notify_clarification = function(msg) { + var message = `Problem ${msg.order} (${msg.problem__name}):\n` + msg.description; + alert(message); +} + +window.register_contest_notification = function(url) { + function get_clarifications() { + $.get(url) + .fail(function() { + console.log("Fail to update clarification"); + }) + .done(function(data) { + try { + JSON.parse(data); + } + catch (e) { + return; + } + + for (i of data) { + window.notify_clarification(i); + } + if (data.status == 403) { + console.log("Fail to retrieve data"); + } + }) + } + get_clarifications(); + setInterval(get_clarifications, 60 * 1000); +} $(function () { // Close dismissable boxes diff --git a/resources/content-description.scss b/resources/content-description.scss index 4c16058..d2ff6f5 100644 --- a/resources/content-description.scss +++ b/resources/content-description.scss @@ -184,6 +184,41 @@ margin-right: auto; } +.codehilitetable { + pre { + padding: 0.5em; + padding-right: 0; + background-color: hsla(0,0%,92.5%,.5); + } + + .linenos { + width: 4%; + + pre { + color: rgba(0,0,0,.26); + background-color: rgba(0,0,0,.07); + width: 100%; + border-right: 0; + + span { + margin-left: 0.4em; + } + } + } + + .code { + padding-left: 0.2em; + + pre { + padding-left: 1em; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + + width: 100%; +} + @media (min-width: 700px) { #common-content { display: flex; diff --git a/resources/fine-uploader/LICENSE b/resources/fine-uploader/LICENSE new file mode 100644 index 0000000..070caa6 --- /dev/null +++ b/resources/fine-uploader/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2010-2012, Andrew Valums +Copyright (c) 2012-2013, Andrew Valums and Raymond S. Nicholus, III +Copyright (c) 2013-present, Widen Enterprises, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/resources/fine-uploader/continue.gif b/resources/fine-uploader/continue.gif new file mode 100644 index 0000000..303b7fb Binary files /dev/null and b/resources/fine-uploader/continue.gif differ diff --git a/resources/fine-uploader/dnd.js b/resources/fine-uploader/dnd.js new file mode 100644 index 0000000..4beb736 --- /dev/null +++ b/resources/fine-uploader/dnd.js @@ -0,0 +1,1100 @@ +// Fine Uploader 5.16.2 - MIT licensed. http://fineuploader.com +(function(global) { + var qq = function(element) { + "use strict"; + return { + hide: function() { + element.style.display = "none"; + return this; + }, + attach: function(type, fn) { + if (element.addEventListener) { + element.addEventListener(type, fn, false); + } else if (element.attachEvent) { + element.attachEvent("on" + type, fn); + } + return function() { + qq(element).detach(type, fn); + }; + }, + detach: function(type, fn) { + if (element.removeEventListener) { + element.removeEventListener(type, fn, false); + } else if (element.attachEvent) { + element.detachEvent("on" + type, fn); + } + return this; + }, + contains: function(descendant) { + if (!descendant) { + return false; + } + if (element === descendant) { + return true; + } + if (element.contains) { + return element.contains(descendant); + } else { + return !!(descendant.compareDocumentPosition(element) & 8); + } + }, + insertBefore: function(elementB) { + elementB.parentNode.insertBefore(element, elementB); + return this; + }, + remove: function() { + element.parentNode.removeChild(element); + return this; + }, + css: function(styles) { + if (element.style == null) { + throw new qq.Error("Can't apply style to node as it is not on the HTMLElement prototype chain!"); + } + if (styles.opacity != null) { + if (typeof element.style.opacity !== "string" && typeof element.filters !== "undefined") { + styles.filter = "alpha(opacity=" + Math.round(100 * styles.opacity) + ")"; + } + } + qq.extend(element.style, styles); + return this; + }, + hasClass: function(name, considerParent) { + var re = new RegExp("(^| )" + name + "( |$)"); + return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className)); + }, + addClass: function(name) { + if (!qq(element).hasClass(name)) { + element.className += " " + name; + } + return this; + }, + removeClass: function(name) { + var re = new RegExp("(^| )" + name + "( |$)"); + element.className = element.className.replace(re, " ").replace(/^\s+|\s+$/g, ""); + return this; + }, + getByClass: function(className, first) { + var candidates, result = []; + if (first && element.querySelector) { + return element.querySelector("." + className); + } else if (element.querySelectorAll) { + return element.querySelectorAll("." + className); + } + candidates = element.getElementsByTagName("*"); + qq.each(candidates, function(idx, val) { + if (qq(val).hasClass(className)) { + result.push(val); + } + }); + return first ? result[0] : result; + }, + getFirstByClass: function(className) { + return qq(element).getByClass(className, true); + }, + children: function() { + var children = [], child = element.firstChild; + while (child) { + if (child.nodeType === 1) { + children.push(child); + } + child = child.nextSibling; + } + return children; + }, + setText: function(text) { + element.innerText = text; + element.textContent = text; + return this; + }, + clearText: function() { + return qq(element).setText(""); + }, + hasAttribute: function(attrName) { + var attrVal; + if (element.hasAttribute) { + if (!element.hasAttribute(attrName)) { + return false; + } + return /^false$/i.exec(element.getAttribute(attrName)) == null; + } else { + attrVal = element[attrName]; + if (attrVal === undefined) { + return false; + } + return /^false$/i.exec(attrVal) == null; + } + } + }; + }; + (function() { + "use strict"; + qq.canvasToBlob = function(canvas, mime, quality) { + return qq.dataUriToBlob(canvas.toDataURL(mime, quality)); + }; + qq.dataUriToBlob = function(dataUri) { + var arrayBuffer, byteString, createBlob = function(data, mime) { + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder(); + if (blobBuilder) { + blobBuilder.append(data); + return blobBuilder.getBlob(mime); + } else { + return new Blob([ data ], { + type: mime + }); + } + }, intArray, mimeString; + if (dataUri.split(",")[0].indexOf("base64") >= 0) { + byteString = atob(dataUri.split(",")[1]); + } else { + byteString = decodeURI(dataUri.split(",")[1]); + } + mimeString = dataUri.split(",")[0].split(":")[1].split(";")[0]; + arrayBuffer = new ArrayBuffer(byteString.length); + intArray = new Uint8Array(arrayBuffer); + qq.each(byteString, function(idx, character) { + intArray[idx] = character.charCodeAt(0); + }); + return createBlob(arrayBuffer, mimeString); + }; + qq.log = function(message, level) { + if (window.console) { + if (!level || level === "info") { + window.console.log(message); + } else { + if (window.console[level]) { + window.console[level](message); + } else { + window.console.log("<" + level + "> " + message); + } + } + } + }; + qq.isObject = function(variable) { + return variable && !variable.nodeType && Object.prototype.toString.call(variable) === "[object Object]"; + }; + qq.isFunction = function(variable) { + return typeof variable === "function"; + }; + qq.isArray = function(value) { + return Object.prototype.toString.call(value) === "[object Array]" || value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer; + }; + qq.isItemList = function(maybeItemList) { + return Object.prototype.toString.call(maybeItemList) === "[object DataTransferItemList]"; + }; + qq.isNodeList = function(maybeNodeList) { + return Object.prototype.toString.call(maybeNodeList) === "[object NodeList]" || maybeNodeList.item && maybeNodeList.namedItem; + }; + qq.isString = function(maybeString) { + return Object.prototype.toString.call(maybeString) === "[object String]"; + }; + qq.trimStr = function(string) { + if (String.prototype.trim) { + return string.trim(); + } + return string.replace(/^\s+|\s+$/g, ""); + }; + qq.format = function(str) { + var args = Array.prototype.slice.call(arguments, 1), newStr = str, nextIdxToReplace = newStr.indexOf("{}"); + qq.each(args, function(idx, val) { + var strBefore = newStr.substring(0, nextIdxToReplace), strAfter = newStr.substring(nextIdxToReplace + 2); + newStr = strBefore + val + strAfter; + nextIdxToReplace = newStr.indexOf("{}", nextIdxToReplace + val.length); + if (nextIdxToReplace < 0) { + return false; + } + }); + return newStr; + }; + qq.isFile = function(maybeFile) { + return window.File && Object.prototype.toString.call(maybeFile) === "[object File]"; + }; + qq.isFileList = function(maybeFileList) { + return window.FileList && Object.prototype.toString.call(maybeFileList) === "[object FileList]"; + }; + qq.isFileOrInput = function(maybeFileOrInput) { + return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput); + }; + qq.isInput = function(maybeInput, notFile) { + var evaluateType = function(type) { + var normalizedType = type.toLowerCase(); + if (notFile) { + return normalizedType !== "file"; + } + return normalizedType === "file"; + }; + if (window.HTMLInputElement) { + if (Object.prototype.toString.call(maybeInput) === "[object HTMLInputElement]") { + if (maybeInput.type && evaluateType(maybeInput.type)) { + return true; + } + } + } + if (maybeInput.tagName) { + if (maybeInput.tagName.toLowerCase() === "input") { + if (maybeInput.type && evaluateType(maybeInput.type)) { + return true; + } + } + } + return false; + }; + qq.isBlob = function(maybeBlob) { + if (window.Blob && Object.prototype.toString.call(maybeBlob) === "[object Blob]") { + return true; + } + }; + qq.isXhrUploadSupported = function() { + var input = document.createElement("input"); + input.type = "file"; + return input.multiple !== undefined && typeof File !== "undefined" && typeof FormData !== "undefined" && typeof qq.createXhrInstance().upload !== "undefined"; + }; + qq.createXhrInstance = function() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } + try { + return new ActiveXObject("MSXML2.XMLHTTP.3.0"); + } catch (error) { + qq.log("Neither XHR or ActiveX are supported!", "error"); + return null; + } + }; + qq.isFolderDropSupported = function(dataTransfer) { + return dataTransfer.items && dataTransfer.items.length > 0 && dataTransfer.items[0].webkitGetAsEntry; + }; + qq.isFileChunkingSupported = function() { + return !qq.androidStock() && qq.isXhrUploadSupported() && (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined); + }; + qq.sliceBlob = function(fileOrBlob, start, end) { + var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice; + return slicer.call(fileOrBlob, start, end); + }; + qq.arrayBufferToHex = function(buffer) { + var bytesAsHex = "", bytes = new Uint8Array(buffer); + qq.each(bytes, function(idx, byt) { + var byteAsHexStr = byt.toString(16); + if (byteAsHexStr.length < 2) { + byteAsHexStr = "0" + byteAsHexStr; + } + bytesAsHex += byteAsHexStr; + }); + return bytesAsHex; + }; + qq.readBlobToHex = function(blob, startOffset, length) { + var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length), fileReader = new FileReader(), promise = new qq.Promise(); + fileReader.onload = function() { + promise.success(qq.arrayBufferToHex(fileReader.result)); + }; + fileReader.onerror = promise.failure; + fileReader.readAsArrayBuffer(initialBlob); + return promise; + }; + qq.extend = function(first, second, extendNested) { + qq.each(second, function(prop, val) { + if (extendNested && qq.isObject(val)) { + if (first[prop] === undefined) { + first[prop] = {}; + } + qq.extend(first[prop], val, true); + } else { + first[prop] = val; + } + }); + return first; + }; + qq.override = function(target, sourceFn) { + var super_ = {}, source = sourceFn(super_); + qq.each(source, function(srcPropName, srcPropVal) { + if (target[srcPropName] !== undefined) { + super_[srcPropName] = target[srcPropName]; + } + target[srcPropName] = srcPropVal; + }); + return target; + }; + qq.indexOf = function(arr, elt, from) { + if (arr.indexOf) { + return arr.indexOf(elt, from); + } + from = from || 0; + var len = arr.length; + if (from < 0) { + from += len; + } + for (;from < len; from += 1) { + if (arr.hasOwnProperty(from) && arr[from] === elt) { + return from; + } + } + return -1; + }; + qq.getUniqueId = function() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8; + return v.toString(16); + }); + }; + qq.ie = function() { + return navigator.userAgent.indexOf("MSIE") !== -1 || navigator.userAgent.indexOf("Trident") !== -1; + }; + qq.ie7 = function() { + return navigator.userAgent.indexOf("MSIE 7") !== -1; + }; + qq.ie8 = function() { + return navigator.userAgent.indexOf("MSIE 8") !== -1; + }; + qq.ie10 = function() { + return navigator.userAgent.indexOf("MSIE 10") !== -1; + }; + qq.ie11 = function() { + return qq.ie() && navigator.userAgent.indexOf("rv:11") !== -1; + }; + qq.edge = function() { + return navigator.userAgent.indexOf("Edge") >= 0; + }; + qq.safari = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Apple") !== -1; + }; + qq.chrome = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Google") !== -1; + }; + qq.opera = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Opera") !== -1; + }; + qq.firefox = function() { + return !qq.edge() && !qq.ie11() && navigator.userAgent.indexOf("Mozilla") !== -1 && navigator.vendor !== undefined && navigator.vendor === ""; + }; + qq.windows = function() { + return navigator.platform === "Win32"; + }; + qq.android = function() { + return navigator.userAgent.toLowerCase().indexOf("android") !== -1; + }; + qq.androidStock = function() { + return qq.android() && navigator.userAgent.toLowerCase().indexOf("chrome") < 0; + }; + qq.ios6 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 6_") !== -1; + }; + qq.ios7 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 7_") !== -1; + }; + qq.ios8 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 8_") !== -1; + }; + qq.ios800 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 8_0 ") !== -1; + }; + qq.ios = function() { + return navigator.userAgent.indexOf("iPad") !== -1 || navigator.userAgent.indexOf("iPod") !== -1 || navigator.userAgent.indexOf("iPhone") !== -1; + }; + qq.iosChrome = function() { + return qq.ios() && navigator.userAgent.indexOf("CriOS") !== -1; + }; + qq.iosSafari = function() { + return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf("Safari") !== -1; + }; + qq.iosSafariWebView = function() { + return qq.ios() && !qq.iosChrome() && !qq.iosSafari(); + }; + qq.preventDefault = function(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + }; + qq.toElement = function() { + var div = document.createElement("div"); + return function(html) { + div.innerHTML = html; + var element = div.firstChild; + div.removeChild(element); + return element; + }; + }(); + qq.each = function(iterableItem, callback) { + var keyOrIndex, retVal; + if (iterableItem) { + if (window.Storage && iterableItem.constructor === window.Storage) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex))); + if (retVal === false) { + break; + } + } + } else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); + if (retVal === false) { + break; + } + } + } else if (qq.isString(iterableItem)) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex)); + if (retVal === false) { + break; + } + } + } else { + for (keyOrIndex in iterableItem) { + if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) { + retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); + if (retVal === false) { + break; + } + } + } + } + } + }; + qq.bind = function(oldFunc, context) { + if (qq.isFunction(oldFunc)) { + var args = Array.prototype.slice.call(arguments, 2); + return function() { + var newArgs = qq.extend([], args); + if (arguments.length) { + newArgs = newArgs.concat(Array.prototype.slice.call(arguments)); + } + return oldFunc.apply(context, newArgs); + }; + } + throw new Error("first parameter must be a function!"); + }; + qq.obj2url = function(obj, temp, prefixDone) { + var uristrings = [], prefix = "&", add = function(nextObj, i) { + var nextTemp = temp ? /\[\]$/.test(temp) ? temp : temp + "[" + i + "]" : i; + if (nextTemp !== "undefined" && i !== "undefined") { + uristrings.push(typeof nextObj === "object" ? qq.obj2url(nextObj, nextTemp, true) : Object.prototype.toString.call(nextObj) === "[object Function]" ? encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj()) : encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj)); + } + }; + if (!prefixDone && temp) { + prefix = /\?/.test(temp) ? /\?$/.test(temp) ? "" : "&" : "?"; + uristrings.push(temp); + uristrings.push(qq.obj2url(obj)); + } else if (Object.prototype.toString.call(obj) === "[object Array]" && typeof obj !== "undefined") { + qq.each(obj, function(idx, val) { + add(val, idx); + }); + } else if (typeof obj !== "undefined" && obj !== null && typeof obj === "object") { + qq.each(obj, function(prop, val) { + add(val, prop); + }); + } else { + uristrings.push(encodeURIComponent(temp) + "=" + encodeURIComponent(obj)); + } + if (temp) { + return uristrings.join(prefix); + } else { + return uristrings.join(prefix).replace(/^&/, "").replace(/%20/g, "+"); + } + }; + qq.obj2FormData = function(obj, formData, arrayKeyName) { + if (!formData) { + formData = new FormData(); + } + qq.each(obj, function(key, val) { + key = arrayKeyName ? arrayKeyName + "[" + key + "]" : key; + if (qq.isObject(val)) { + qq.obj2FormData(val, formData, key); + } else if (qq.isFunction(val)) { + formData.append(key, val()); + } else { + formData.append(key, val); + } + }); + return formData; + }; + qq.obj2Inputs = function(obj, form) { + var input; + if (!form) { + form = document.createElement("form"); + } + qq.obj2FormData(obj, { + append: function(key, val) { + input = document.createElement("input"); + input.setAttribute("name", key); + input.setAttribute("value", val); + form.appendChild(input); + } + }); + return form; + }; + qq.parseJson = function(json) { + if (window.JSON && qq.isFunction(JSON.parse)) { + return JSON.parse(json); + } else { + return eval("(" + json + ")"); + } + }; + qq.getExtension = function(filename) { + var extIdx = filename.lastIndexOf(".") + 1; + if (extIdx > 0) { + return filename.substr(extIdx, filename.length - extIdx); + } + }; + qq.getFilename = function(blobOrFileInput) { + if (qq.isInput(blobOrFileInput)) { + return blobOrFileInput.value.replace(/.*(\/|\\)/, ""); + } else if (qq.isFile(blobOrFileInput)) { + if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) { + return blobOrFileInput.fileName; + } + } + return blobOrFileInput.name; + }; + qq.DisposeSupport = function() { + var disposers = []; + return { + dispose: function() { + var disposer; + do { + disposer = disposers.shift(); + if (disposer) { + disposer(); + } + } while (disposer); + }, + attach: function() { + var args = arguments; + this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1))); + }, + addDisposer: function(disposeFunction) { + disposers.push(disposeFunction); + } + }; + }; + })(); + (function() { + "use strict"; + if (typeof define === "function" && define.amd) { + define(function() { + return qq; + }); + } else if (typeof module !== "undefined" && module.exports) { + module.exports = qq; + } else { + global.qq = qq; + } + })(); + qq.version = "5.16.2"; + qq.supportedFeatures = function() { + "use strict"; + var supportsUploading, supportsUploadingBlobs, supportsFileDrop, supportsAjaxFileUploading, supportsFolderDrop, supportsChunking, supportsResume, supportsUploadViaPaste, supportsUploadCors, supportsDeleteFileXdr, supportsDeleteFileCorsXhr, supportsDeleteFileCors, supportsFolderSelection, supportsImagePreviews, supportsUploadProgress; + function testSupportsFileInputElement() { + var supported = true, tempInput; + try { + tempInput = document.createElement("input"); + tempInput.type = "file"; + qq(tempInput).hide(); + if (tempInput.disabled) { + supported = false; + } + } catch (ex) { + supported = false; + } + return supported; + } + function isChrome14OrHigher() { + return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\/[1][4-9]|Chrome\/[2-9][0-9]/) !== undefined; + } + function isCrossOriginXhrSupported() { + if (window.XMLHttpRequest) { + var xhr = qq.createXhrInstance(); + return xhr.withCredentials !== undefined; + } + return false; + } + function isXdrSupported() { + return window.XDomainRequest !== undefined; + } + function isCrossOriginAjaxSupported() { + if (isCrossOriginXhrSupported()) { + return true; + } + return isXdrSupported(); + } + function isFolderSelectionSupported() { + return document.createElement("input").webkitdirectory !== undefined; + } + function isLocalStorageSupported() { + try { + return !!window.localStorage && qq.isFunction(window.localStorage.setItem); + } catch (error) { + return false; + } + } + function isDragAndDropSupported() { + var span = document.createElement("span"); + return ("draggable" in span || "ondragstart" in span && "ondrop" in span) && !qq.android() && !qq.ios(); + } + supportsUploading = testSupportsFileInputElement(); + supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported(); + supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock(); + supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported(); + supportsFolderDrop = supportsFileDrop && function() { + var input = document.createElement("input"); + input.type = "file"; + return !!("webkitdirectory" in (input || document.querySelectorAll("input[type=file]")[0])); + }(); + supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported(); + supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported(); + supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher(); + supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading); + supportsDeleteFileCorsXhr = isCrossOriginXhrSupported(); + supportsDeleteFileXdr = isXdrSupported(); + supportsDeleteFileCors = isCrossOriginAjaxSupported(); + supportsFolderSelection = isFolderSelectionSupported(); + supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined; + supportsUploadProgress = function() { + if (supportsAjaxFileUploading) { + return !qq.androidStock() && !qq.iosChrome(); + } + return false; + }(); + return { + ajaxUploading: supportsAjaxFileUploading, + blobUploading: supportsUploadingBlobs, + canDetermineSize: supportsAjaxFileUploading, + chunking: supportsChunking, + deleteFileCors: supportsDeleteFileCors, + deleteFileCorsXdr: supportsDeleteFileXdr, + deleteFileCorsXhr: supportsDeleteFileCorsXhr, + dialogElement: !!window.HTMLDialogElement, + fileDrop: supportsFileDrop, + folderDrop: supportsFolderDrop, + folderSelection: supportsFolderSelection, + imagePreviews: supportsImagePreviews, + imageValidation: supportsImagePreviews, + itemSizeValidation: supportsAjaxFileUploading, + pause: supportsChunking, + progressBar: supportsUploadProgress, + resume: supportsResume, + scaling: supportsImagePreviews && supportsUploadingBlobs, + tiffPreviews: qq.safari(), + unlimitedScaledImageSize: !qq.ios(), + uploading: supportsUploading, + uploadCors: supportsUploadCors, + uploadCustomHeaders: supportsAjaxFileUploading, + uploadNonMultipart: supportsAjaxFileUploading, + uploadViaPaste: supportsUploadViaPaste + }; + }(); + qq.isGenericPromise = function(maybePromise) { + "use strict"; + return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then)); + }; + qq.Promise = function() { + "use strict"; + var successArgs, failureArgs, successCallbacks = [], failureCallbacks = [], doneCallbacks = [], state = 0; + qq.extend(this, { + then: function(onSuccess, onFailure) { + if (state === 0) { + if (onSuccess) { + successCallbacks.push(onSuccess); + } + if (onFailure) { + failureCallbacks.push(onFailure); + } + } else if (state === -1) { + onFailure && onFailure.apply(null, failureArgs); + } else if (onSuccess) { + onSuccess.apply(null, successArgs); + } + return this; + }, + done: function(callback) { + if (state === 0) { + doneCallbacks.push(callback); + } else { + callback.apply(null, failureArgs === undefined ? successArgs : failureArgs); + } + return this; + }, + success: function() { + state = 1; + successArgs = arguments; + if (successCallbacks.length) { + qq.each(successCallbacks, function(idx, callback) { + callback.apply(null, successArgs); + }); + } + if (doneCallbacks.length) { + qq.each(doneCallbacks, function(idx, callback) { + callback.apply(null, successArgs); + }); + } + return this; + }, + failure: function() { + state = -1; + failureArgs = arguments; + if (failureCallbacks.length) { + qq.each(failureCallbacks, function(idx, callback) { + callback.apply(null, failureArgs); + }); + } + if (doneCallbacks.length) { + qq.each(doneCallbacks, function(idx, callback) { + callback.apply(null, failureArgs); + }); + } + return this; + } + }); + }; + qq.DragAndDrop = function(o) { + "use strict"; + var options, HIDE_ZONES_EVENT_NAME = "qq-hidezones", HIDE_BEFORE_ENTER_ATTR = "qq-hide-dropzone", uploadDropZones = [], droppedFiles = [], disposeSupport = new qq.DisposeSupport(); + options = { + dropZoneElements: [], + allowMultipleItems: true, + classes: { + dropActive: null + }, + callbacks: new qq.DragAndDrop.callbacks() + }; + qq.extend(options, o, true); + function uploadDroppedFiles(files, uploadDropZone) { + var filesAsArray = Array.prototype.slice.call(files); + options.callbacks.dropLog("Grabbed " + files.length + " dropped files."); + uploadDropZone.dropDisabled(false); + options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement()); + } + function traverseFileTree(entry) { + var parseEntryPromise = new qq.Promise(); + if (entry.isFile) { + entry.file(function(file) { + file.qqPath = extractDirectoryPath(entry); + droppedFiles.push(file); + parseEntryPromise.success(); + }, function(fileError) { + options.callbacks.dropLog("Problem parsing '" + entry.fullPath + "'. FileError code " + fileError.code + ".", "error"); + parseEntryPromise.failure(); + }); + } else if (entry.isDirectory) { + getFilesInDirectory(entry).then(function allEntriesRead(entries) { + var entriesLeft = entries.length; + qq.each(entries, function(idx, entry) { + traverseFileTree(entry).done(function() { + entriesLeft -= 1; + if (entriesLeft === 0) { + parseEntryPromise.success(); + } + }); + }); + if (!entries.length) { + parseEntryPromise.success(); + } + }, function readFailure(fileError) { + options.callbacks.dropLog("Problem parsing '" + entry.fullPath + "'. FileError code " + fileError.code + ".", "error"); + parseEntryPromise.failure(); + }); + } + return parseEntryPromise; + } + function extractDirectoryPath(entry) { + var name = entry.name, fullPath = entry.fullPath, indexOfNameInFullPath = fullPath.lastIndexOf(name); + fullPath = fullPath.substr(0, indexOfNameInFullPath); + if (fullPath.charAt(0) === "/") { + fullPath = fullPath.substr(1); + } + return fullPath; + } + function getFilesInDirectory(entry, reader, accumEntries, existingPromise) { + var promise = existingPromise || new qq.Promise(), dirReader = reader || entry.createReader(); + dirReader.readEntries(function readSuccess(entries) { + var newEntries = accumEntries ? accumEntries.concat(entries) : entries; + if (entries.length) { + setTimeout(function() { + getFilesInDirectory(entry, dirReader, newEntries, promise); + }, 0); + } else { + promise.success(newEntries); + } + }, promise.failure); + return promise; + } + function handleDataTransfer(dataTransfer, uploadDropZone) { + var pendingFolderPromises = [], handleDataTransferPromise = new qq.Promise(); + options.callbacks.processingDroppedFiles(); + uploadDropZone.dropDisabled(true); + if (dataTransfer.files.length > 1 && !options.allowMultipleItems) { + options.callbacks.processingDroppedFilesComplete([]); + options.callbacks.dropError("tooManyFilesError", ""); + uploadDropZone.dropDisabled(false); + handleDataTransferPromise.failure(); + } else { + droppedFiles = []; + if (qq.isFolderDropSupported(dataTransfer)) { + qq.each(dataTransfer.items, function(idx, item) { + var entry = item.webkitGetAsEntry(); + if (entry) { + if (entry.isFile) { + droppedFiles.push(item.getAsFile()); + } else { + pendingFolderPromises.push(traverseFileTree(entry).done(function() { + pendingFolderPromises.pop(); + if (pendingFolderPromises.length === 0) { + handleDataTransferPromise.success(); + } + })); + } + } + }); + } else { + droppedFiles = dataTransfer.files; + } + if (pendingFolderPromises.length === 0) { + handleDataTransferPromise.success(); + } + } + return handleDataTransferPromise; + } + function setupDropzone(dropArea) { + var dropZone = new qq.UploadDropZone({ + HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME, + element: dropArea, + onEnter: function(e) { + qq(dropArea).addClass(options.classes.dropActive); + e.stopPropagation(); + }, + onLeaveNotDescendants: function(e) { + qq(dropArea).removeClass(options.classes.dropActive); + }, + onDrop: function(e) { + handleDataTransfer(e.dataTransfer, dropZone).then(function() { + uploadDroppedFiles(droppedFiles, dropZone); + }, function() { + options.callbacks.dropLog("Drop event DataTransfer parsing failed. No files will be uploaded.", "error"); + }); + } + }); + disposeSupport.addDisposer(function() { + dropZone.dispose(); + }); + qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide(); + uploadDropZones.push(dropZone); + return dropZone; + } + function isFileDrag(dragEvent) { + var fileDrag; + qq.each(dragEvent.dataTransfer.types, function(key, val) { + if (val === "Files") { + fileDrag = true; + return false; + } + }); + return fileDrag; + } + function leavingDocumentOut(e) { + if (qq.safari()) { + return e.x < 0 || e.y < 0; + } + return e.x === 0 && e.y === 0; + } + function setupDragDrop() { + var dropZones = options.dropZoneElements, maybeHideDropZones = function() { + setTimeout(function() { + qq.each(dropZones, function(idx, dropZone) { + qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide(); + qq(dropZone).removeClass(options.classes.dropActive); + }); + }, 10); + }; + qq.each(dropZones, function(idx, dropZone) { + var uploadDropZone = setupDropzone(dropZone); + if (dropZones.length && qq.supportedFeatures.fileDrop) { + disposeSupport.attach(document, "dragenter", function(e) { + if (!uploadDropZone.dropDisabled() && isFileDrag(e)) { + qq.each(dropZones, function(idx, dropZone) { + if (dropZone instanceof HTMLElement && qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR)) { + qq(dropZone).css({ + display: "block" + }); + } + }); + } + }); + } + }); + disposeSupport.attach(document, "dragleave", function(e) { + if (leavingDocumentOut(e)) { + maybeHideDropZones(); + } + }); + disposeSupport.attach(qq(document).children()[0], "mouseenter", function(e) { + maybeHideDropZones(); + }); + disposeSupport.attach(document, "drop", function(e) { + if (isFileDrag(e)) { + e.preventDefault(); + maybeHideDropZones(); + } + }); + disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, maybeHideDropZones); + } + setupDragDrop(); + qq.extend(this, { + setupExtraDropzone: function(element) { + options.dropZoneElements.push(element); + setupDropzone(element); + }, + removeDropzone: function(element) { + var i, dzs = options.dropZoneElements; + for (i in dzs) { + if (dzs[i] === element) { + return dzs.splice(i, 1); + } + } + }, + dispose: function() { + disposeSupport.dispose(); + qq.each(uploadDropZones, function(idx, dropZone) { + dropZone.dispose(); + }); + } + }); + this._testing = {}; + this._testing.extractDirectoryPath = extractDirectoryPath; + }; + qq.DragAndDrop.callbacks = function() { + "use strict"; + return { + processingDroppedFiles: function() {}, + processingDroppedFilesComplete: function(files, targetEl) {}, + dropError: function(code, errorSpecifics) { + qq.log("Drag & drop error code '" + code + " with these specifics: '" + errorSpecifics + "'", "error"); + }, + dropLog: function(message, level) { + qq.log(message, level); + } + }; + }; + qq.UploadDropZone = function(o) { + "use strict"; + var disposeSupport = new qq.DisposeSupport(), options, element, preventDrop, dropOutsideDisabled; + options = { + element: null, + onEnter: function(e) {}, + onLeave: function(e) {}, + onLeaveNotDescendants: function(e) {}, + onDrop: function(e) {} + }; + qq.extend(options, o); + element = options.element; + function dragoverShouldBeCanceled() { + return qq.safari() || qq.firefox() && qq.windows(); + } + function disableDropOutside(e) { + if (!dropOutsideDisabled) { + if (dragoverShouldBeCanceled) { + disposeSupport.attach(document, "dragover", function(e) { + e.preventDefault(); + }); + } else { + disposeSupport.attach(document, "dragover", function(e) { + if (e.dataTransfer) { + e.dataTransfer.dropEffect = "none"; + e.preventDefault(); + } + }); + } + dropOutsideDisabled = true; + } + } + function isValidFileDrag(e) { + if (!qq.supportedFeatures.fileDrop) { + return false; + } + var effectTest, dt = e.dataTransfer, isSafari = qq.safari(); + effectTest = qq.ie() && qq.supportedFeatures.fileDrop ? true : dt.effectAllowed !== "none"; + return dt && effectTest && (dt.files && dt.files.length || !isSafari && dt.types.contains && dt.types.contains("Files") || dt.types.includes && dt.types.includes("Files")); + } + function isOrSetDropDisabled(isDisabled) { + if (isDisabled !== undefined) { + preventDrop = isDisabled; + } + return preventDrop; + } + function triggerHidezonesEvent() { + var hideZonesEvent; + function triggerUsingOldApi() { + hideZonesEvent = document.createEvent("Event"); + hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true); + } + if (window.CustomEvent) { + try { + hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME); + } catch (err) { + triggerUsingOldApi(); + } + } else { + triggerUsingOldApi(); + } + document.dispatchEvent(hideZonesEvent); + } + function attachEvents() { + disposeSupport.attach(element, "dragover", function(e) { + if (!isValidFileDrag(e)) { + return; + } + var effect = qq.ie() && qq.supportedFeatures.fileDrop ? null : e.dataTransfer.effectAllowed; + if (effect === "move" || effect === "linkMove") { + e.dataTransfer.dropEffect = "move"; + } else { + e.dataTransfer.dropEffect = "copy"; + } + e.stopPropagation(); + e.preventDefault(); + }); + disposeSupport.attach(element, "dragenter", function(e) { + if (!isOrSetDropDisabled()) { + if (!isValidFileDrag(e)) { + return; + } + options.onEnter(e); + } + }); + disposeSupport.attach(element, "dragleave", function(e) { + if (!isValidFileDrag(e)) { + return; + } + options.onLeave(e); + var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); + if (qq(this).contains(relatedTarget)) { + return; + } + options.onLeaveNotDescendants(e); + }); + disposeSupport.attach(element, "drop", function(e) { + if (!isOrSetDropDisabled()) { + if (!isValidFileDrag(e)) { + return; + } + e.preventDefault(); + e.stopPropagation(); + options.onDrop(e); + triggerHidezonesEvent(); + } + }); + } + disableDropOutside(); + attachEvents(); + qq.extend(this, { + dropDisabled: function(isDisabled) { + return isOrSetDropDisabled(isDisabled); + }, + dispose: function() { + disposeSupport.dispose(); + }, + getElement: function() { + return element; + } + }); + this._testing = {}; + this._testing.isValidFileDrag = isValidFileDrag; + }; +})(window); +//# sourceMappingURL=dnd.js.map \ No newline at end of file diff --git a/resources/fine-uploader/dnd.js.map b/resources/fine-uploader/dnd.js.map new file mode 100644 index 0000000..853391d --- /dev/null +++ b/resources/fine-uploader/dnd.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["?","../client/js/util.js","../client/js/export.js","../client/js/version.js","../client/js/features.js","../client/js/promise.js","../client/js/dnd.js"],"names":["global","qq","element","hide","style","display","this","attach","type","fn","addEventListener","attachEvent","detach","removeEventListener","detachEvent","contains","descendant","compareDocumentPosition","insertBefore","elementB","parentNode","remove","removeChild","css","styles","Error","opacity","filter","Math","round","extend","hasClass","name","considerParent","re","RegExp","test","className","addClass","removeClass","replace","getByClass","first","candidates","result","querySelector","querySelectorAll","getElementsByTagName","each","idx","val","push","getFirstByClass","children","child","firstChild","nodeType","nextSibling","setText","text","innerText","textContent","clearText","hasAttribute","attrName","attrVal","exec","getAttribute","undefined","canvasToBlob","canvas","mime","quality","dataUriToBlob","toDataURL","dataUri","arrayBuffer","byteString","createBlob","data","BlobBuilder","window","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","blobBuilder","append","getBlob","Blob","intArray","mimeString","split","indexOf","atob","decodeURI","ArrayBuffer","length","Uint8Array","character","charCodeAt","log","message","level","console","isObject","variable","Object","prototype","toString","call","isFunction","isArray","value","buffer","constructor","isItemList","maybeItemList","isNodeList","maybeNodeList","item","namedItem","isString","maybeString","trimStr","string","String","trim","format","str","args","Array","slice","arguments","newStr","nextIdxToReplace","strBefore","substring","strAfter","isFile","maybeFile","File","isFileList","maybeFileList","FileList","isFileOrInput","maybeFileOrInput","isInput","maybeInput","notFile","evaluateType","normalizedType","toLowerCase","HTMLInputElement","tagName","isBlob","maybeBlob","isXhrUploadSupported","input","document","createElement","multiple","FormData","createXhrInstance","upload","XMLHttpRequest","ActiveXObject","error","isFolderDropSupported","dataTransfer","items","webkitGetAsEntry","isFileChunkingSupported","androidStock","webkitSlice","mozSlice","sliceBlob","fileOrBlob","start","end","slicer","arrayBufferToHex","bytesAsHex","bytes","byt","byteAsHexStr","readBlobToHex","blob","startOffset","initialBlob","fileReader","FileReader","promise","Promise","onload","success","onerror","failure","readAsArrayBuffer","second","extendNested","prop","override","target","sourceFn","super_","source","srcPropName","srcPropVal","arr","elt","from","len","hasOwnProperty","getUniqueId","c","r","random","v","ie","navigator","userAgent","ie7","ie8","ie10","ie11","edge","safari","vendor","chrome","opera","firefox","windows","platform","android","ios6","ios","ios7","ios8","ios800","iosChrome","iosSafari","iosSafariWebView","preventDefault","e","returnValue","toElement","div","html","innerHTML","iterableItem","callback","keyOrIndex","retVal","Storage","key","getItem","charAt","bind","oldFunc","context","newArgs","concat","apply","obj2url","obj","temp","prefixDone","uristrings","prefix","add","nextObj","i","nextTemp","encodeURIComponent","join","obj2FormData","formData","arrayKeyName","obj2Inputs","form","setAttribute","appendChild","parseJson","json","JSON","parse","eval","getExtension","filename","extIdx","lastIndexOf","substr","getFilename","blobOrFileInput","fileName","DisposeSupport","disposers","dispose","disposer","shift","addDisposer","disposeFunction","define","amd","module","exports","version","supportedFeatures","supportsUploading","supportsUploadingBlobs","supportsFileDrop","supportsAjaxFileUploading","supportsFolderDrop","supportsChunking","supportsResume","supportsUploadViaPaste","supportsUploadCors","supportsDeleteFileXdr","supportsDeleteFileCorsXhr","supportsDeleteFileCors","supportsFolderSelection","supportsImagePreviews","supportsUploadProgress","testSupportsFileInputElement","supported","tempInput","disabled","ex","isChrome14OrHigher","match","isCrossOriginXhrSupported","xhr","withCredentials","isXdrSupported","XDomainRequest","isCrossOriginAjaxSupported","isFolderSelectionSupported","webkitdirectory","isLocalStorageSupported","localStorage","setItem","isDragAndDropSupported","span","postMessage","ajaxUploading","blobUploading","canDetermineSize","chunking","deleteFileCors","deleteFileCorsXdr","deleteFileCorsXhr","dialogElement","HTMLDialogElement","fileDrop","folderDrop","folderSelection","imagePreviews","imageValidation","itemSizeValidation","pause","progressBar","resume","scaling","tiffPreviews","unlimitedScaledImageSize","uploading","uploadCors","uploadCustomHeaders","uploadNonMultipart","uploadViaPaste","isGenericPromise","maybePromise","then","successArgs","failureArgs","successCallbacks","failureCallbacks","doneCallbacks","state","onSuccess","onFailure","done","DragAndDrop","o","options","HIDE_ZONES_EVENT_NAME","HIDE_BEFORE_ENTER_ATTR","uploadDropZones","droppedFiles","disposeSupport","dropZoneElements","allowMultipleItems","classes","dropActive","callbacks","uploadDroppedFiles","files","uploadDropZone","filesAsArray","dropLog","dropDisabled","processingDroppedFilesComplete","getElement","traverseFileTree","entry","parseEntryPromise","file","qqPath","extractDirectoryPath","fileError","fullPath","code","isDirectory","getFilesInDirectory","allEntriesRead","entries","entriesLeft","readFailure","indexOfNameInFullPath","reader","accumEntries","existingPromise","dirReader","createReader","readEntries","readSuccess","newEntries","setTimeout","handleDataTransfer","pendingFolderPromises","handleDataTransferPromise","processingDroppedFiles","dropError","getAsFile","pop","setupDropzone","dropArea","dropZone","UploadDropZone","onEnter","stopPropagation","onLeaveNotDescendants","onDrop","isFileDrag","dragEvent","fileDrag","types","leavingDocumentOut","x","y","setupDragDrop","dropZones","maybeHideDropZones","HTMLElement","setupExtraDropzone","removeDropzone","dzs","splice","_testing","targetEl","errorSpecifics","preventDrop","dropOutsideDisabled","onLeave","dragoverShouldBeCanceled","disableDropOutside","dropEffect","isValidFileDrag","effectTest","dt","isSafari","effectAllowed","includes","isOrSetDropDisabled","isDisabled","triggerHidezonesEvent","hideZonesEvent","triggerUsingOldApi","createEvent","initEvent","CustomEvent","err","dispatchEvent","attachEvents","effect","relatedTarget","elementFromPoint","clientX","clientY"],"mappings":";CAAA,SAAUA;ICEV,IAAIC,KAAK,SAASC;QACd;QAEA;YACIC,MAAM;gBACFD,QAAQE,MAAMC,UAAU;gBACxB,OAAOC;;YAIXC,QAAQ,SAASC,MAAMC;gBACnB,IAAIP,QAAQQ,kBAAkB;oBAC1BR,QAAQQ,iBAAiBF,MAAMC,IAAI;uBAChC,IAAIP,QAAQS,aAAa;oBAC5BT,QAAQS,YAAY,OAAOH,MAAMC;;gBAErC,OAAO;oBACHR,GAAGC,SAASU,OAAOJ,MAAMC;;;YAIjCG,QAAQ,SAASJ,MAAMC;gBACnB,IAAIP,QAAQW,qBAAqB;oBAC7BX,QAAQW,oBAAoBL,MAAMC,IAAI;uBACnC,IAAIP,QAAQS,aAAa;oBAC5BT,QAAQY,YAAY,OAAON,MAAMC;;gBAErC,OAAOH;;YAGXS,UAAU,SAASC;gBAKf,KAAKA,YAAY;oBACb,OAAO;;gBAIX,IAAId,YAAYc,YAAY;oBACxB,OAAO;;gBAGX,IAAId,QAAQa,UAAU;oBAClB,OAAOb,QAAQa,SAASC;uBACrB;oBAEH,UAAUA,WAAWC,wBAAwBf,WAAW;;;YAOhEgB,cAAc,SAASC;gBACnBA,SAASC,WAAWF,aAAahB,SAASiB;gBAC1C,OAAOb;;YAGXe,QAAQ;gBACJnB,QAAQkB,WAAWE,YAAYpB;gBAC/B,OAAOI;;YAOXiB,KAAK,SAASC;gBAEV,IAAItB,QAAQE,SAAS,MAAM;oBACvB,MAAM,IAAIH,GAAGwB,MAAM;;gBAIvB,IAAID,OAAOE,WAAW,MAAM;oBACxB,WAAWxB,QAAQE,MAAMsB,YAAY,mBAAoBxB,QAAe,YAAM,aAAa;wBACvFsB,OAAOG,SAAS,mBAAmBC,KAAKC,MAAM,MAAML,OAAOE,WAAW;;;gBAG9EzB,GAAG6B,OAAO5B,QAAQE,OAAOoB;gBAEzB,OAAOlB;;YAGXyB,UAAU,SAASC,MAAMC;gBACrB,IAAIC,KAAK,IAAIC,OAAO,UAAUH,OAAO;gBACrC,OAAOE,GAAGE,KAAKlC,QAAQmC,iBAAiBJ,kBAAkBC,GAAGE,KAAKlC,QAAQkB,WAAWiB;;YAGzFC,UAAU,SAASN;gBACf,KAAK/B,GAAGC,SAAS6B,SAASC,OAAO;oBAC7B9B,QAAQmC,aAAa,MAAML;;gBAE/B,OAAO1B;;YAGXiC,aAAa,SAASP;gBAClB,IAAIE,KAAK,IAAIC,OAAO,UAAUH,OAAO;gBACrC9B,QAAQmC,YAAYnC,QAAQmC,UAAUG,QAAQN,IAAI,KAAKM,QAAQ,cAAc;gBAC7E,OAAOlC;;YAGXmC,YAAY,SAASJ,WAAWK;gBAC5B,IAAIC,YACAC;gBAEJ,IAAIF,SAASxC,QAAQ2C,eAAe;oBAChC,OAAO3C,QAAQ2C,cAAc,MAAMR;uBAElC,IAAInC,QAAQ4C,kBAAkB;oBAC/B,OAAO5C,QAAQ4C,iBAAiB,MAAMT;;gBAG1CM,aAAazC,QAAQ6C,qBAAqB;gBAE1C9C,GAAG+C,KAAKL,YAAY,SAASM,KAAKC;oBAC9B,IAAIjD,GAAGiD,KAAKnB,SAASM,YAAY;wBAC7BO,OAAOO,KAAKD;;;gBAGpB,OAAOR,QAAQE,OAAO,KAAKA;;YAG/BQ,iBAAiB,SAASf;gBACtB,OAAOpC,GAAGC,SAASuC,WAAWJ,WAAW;;YAG7CgB,UAAU;gBACN,IAAIA,eACAC,QAAQpD,QAAQqD;gBAEpB,OAAOD,OAAO;oBACV,IAAIA,MAAME,aAAa,GAAG;wBACtBH,SAASF,KAAKG;;oBAElBA,QAAQA,MAAMG;;gBAGlB,OAAOJ;;YAGXK,SAAS,SAASC;gBACdzD,QAAQ0D,YAAYD;gBACpBzD,QAAQ2D,cAAcF;gBACtB,OAAOrD;;YAGXwD,WAAW;gBACP,OAAO7D,GAAGC,SAASwD,QAAQ;;YAK/BK,cAAc,SAASC;gBACnB,IAAIC;gBAEJ,IAAI/D,QAAQ6D,cAAc;oBAEtB,KAAK7D,QAAQ6D,aAAaC,WAAW;wBACjC,OAAO;;oBAIX,OAAO,WAAaE,KAAKhE,QAAQiE,aAAaH,cAAc;uBAE3D;oBACDC,UAAU/D,QAAQ8D;oBAElB,IAAIC,YAAYG,WAAW;wBACvB,OAAO;;oBAIX,OAAO,WAAaF,KAAKD,YAAY;;;;;KAMpD;QACG;QAEAhE,GAAGoE,eAAe,SAASC,QAAQC,MAAMC;YACrC,OAAOvE,GAAGwE,cAAcH,OAAOI,UAAUH,MAAMC;;QAGnDvE,GAAGwE,gBAAgB,SAASE;YACxB,IAAIC,aAAaC,YACbC,aAAa,SAASC,MAAMR;gBACxB,IAAIS,cAAcC,OAAOD,eACjBC,OAAOC,qBACPD,OAAOE,kBACPF,OAAOG,eACXC,cAAcL,eAAe,IAAIA;gBAErC,IAAIK,aAAa;oBACbA,YAAYC,OAAOP;oBACnB,OAAOM,YAAYE,QAAQhB;uBAE1B;oBACD,OAAO,IAAIiB,OAAMT;wBAAQvE,MAAM+D;;;eAGvCkB,UAAUC;YAGd,IAAIf,QAAQgB,MAAM,KAAK,GAAGC,QAAQ,aAAa,GAAG;gBAC9Cf,aAAagB,KAAKlB,QAAQgB,MAAM,KAAK;mBAEpC;gBACDd,aAAaiB,UAAUnB,QAAQgB,MAAM,KAAK;;YAI9CD,aAAaf,QAAQgB,MAAM,KAAK,GAC3BA,MAAM,KAAK,GACXA,MAAM,KAAK;YAGhBf,cAAc,IAAImB,YAAYlB,WAAWmB;YACzCP,WAAW,IAAIQ,WAAWrB;YAC1B3E,GAAG+C,KAAK6B,YAAY,SAAS5B,KAAKiD;gBAC9BT,SAASxC,OAAOiD,UAAUC,WAAW;;YAGzC,OAAOrB,WAAWF,aAAac;;QAGnCzF,GAAGmG,MAAM,SAASC,SAASC;YACvB,IAAIrB,OAAOsB,SAAS;gBAChB,KAAKD,SAASA,UAAU,QAAQ;oBAC5BrB,OAAOsB,QAAQH,IAAIC;uBAGvB;oBACI,IAAIpB,OAAOsB,QAAQD,QAAQ;wBACvBrB,OAAOsB,QAAQD,OAAOD;2BAErB;wBACDpB,OAAOsB,QAAQH,IAAI,MAAME,QAAQ,OAAOD;;;;;QAMxDpG,GAAGuG,WAAW,SAASC;YACnB,OAAOA,aAAaA,SAASjD,YAAYkD,OAAOC,UAAUC,SAASC,KAAKJ,cAAc;;QAG1FxG,GAAG6G,aAAa,SAASL;YACrB,cAAc,aAAe;;QASjCxG,GAAG8G,UAAU,SAASC;YAClB,OAAON,OAAOC,UAAUC,SAASC,KAAKG,WAAW,oBAC5CA,SAAS/B,OAAOc,eAAeiB,MAAMC,UAAUD,MAAMC,OAAOC,gBAAgBnB;;QAIrF9F,GAAGkH,aAAa,SAASC;YACrB,OAAOV,OAAOC,UAAUC,SAASC,KAAKO,mBAAmB;;QAK7DnH,GAAGoH,aAAa,SAASC;YACrB,OAAOZ,OAAOC,UAAUC,SAASC,KAAKS,mBAAmB,uBAGpDA,cAAcC,QAAQD,cAAcE;;QAG7CvH,GAAGwH,WAAW,SAASC;YACnB,OAAOhB,OAAOC,UAAUC,SAASC,KAAKa,iBAAiB;;QAG3DzH,GAAG0H,UAAU,SAASC;YAClB,IAAIC,OAAOlB,UAAUmB,MAAM;gBACvB,OAAOF,OAAOE;;YAGlB,OAAOF,OAAOpF,QAAQ,cAAc;;QAOxCvC,GAAG8H,SAAS,SAASC;YAEjB,IAAIC,OAAQC,MAAMvB,UAAUwB,MAAMtB,KAAKuB,WAAW,IAC9CC,SAASL,KACTM,mBAAmBD,OAAOzC,QAAQ;YAEtC3F,GAAG+C,KAAKiF,MAAM,SAAShF,KAAKC;gBACxB,IAAIqF,YAAYF,OAAOG,UAAU,GAAGF,mBAChCG,WAAWJ,OAAOG,UAAUF,mBAAmB;gBAEnDD,SAASE,YAAYrF,MAAMuF;gBAC3BH,mBAAmBD,OAAOzC,QAAQ,MAAM0C,mBAAmBpF,IAAI8C;gBAG/D,IAAIsC,mBAAmB,GAAG;oBACtB,OAAO;;;YAIf,OAAOD;;QAGXpI,GAAGyI,SAAS,SAASC;YACjB,OAAO1D,OAAO2D,QAAQlC,OAAOC,UAAUC,SAASC,KAAK8B,eAAe;;QAGxE1I,GAAG4I,aAAa,SAASC;YACrB,OAAO7D,OAAO8D,YAAYrC,OAAOC,UAAUC,SAASC,KAAKiC,mBAAmB;;QAGhF7I,GAAG+I,gBAAgB,SAASC;YACxB,OAAOhJ,GAAGyI,OAAOO,qBAAqBhJ,GAAGiJ,QAAQD;;QAGrDhJ,GAAGiJ,UAAU,SAASC,YAAYC;YAC9B,IAAIC,eAAe,SAAS7I;gBACxB,IAAI8I,iBAAiB9I,KAAK+I;gBAE1B,IAAIH,SAAS;oBACT,OAAOE,mBAAmB;;gBAG9B,OAAOA,mBAAmB;;YAG9B,IAAIrE,OAAOuE,kBAAkB;gBACzB,IAAI9C,OAAOC,UAAUC,SAASC,KAAKsC,gBAAgB,6BAA6B;oBAC5E,IAAIA,WAAW3I,QAAQ6I,aAAaF,WAAW3I,OAAO;wBAClD,OAAO;;;;YAInB,IAAI2I,WAAWM,SAAS;gBACpB,IAAIN,WAAWM,QAAQF,kBAAkB,SAAS;oBAC9C,IAAIJ,WAAW3I,QAAQ6I,aAAaF,WAAW3I,OAAO;wBAClD,OAAO;;;;YAKnB,OAAO;;QAGXP,GAAGyJ,SAAS,SAASC;YACjB,IAAI1E,OAAOO,QAAQkB,OAAOC,UAAUC,SAASC,KAAK8C,eAAe,iBAAiB;gBAC9E,OAAO;;;QAIf1J,GAAG2J,uBAAuB;YACtB,IAAIC,QAAQC,SAASC,cAAc;YACnCF,MAAMrJ,OAAO;YAEb,OACIqJ,MAAMG,aAAa5F,oBACRwE,SAAS,sBACTqB,aAAa,sBACZhK,GAAGiK,oBAAqBC,WAAW;;QAIvDlK,GAAGiK,oBAAoB;YACnB,IAAIjF,OAAOmF,gBAAgB;gBACvB,OAAO,IAAIA;;YAGf;gBACI,OAAO,IAAIC,cAAc;cAE7B,OAAOC;gBACHrK,GAAGmG,IAAI,yCAAyC;gBAChD,OAAO;;;QAIfnG,GAAGsK,wBAAwB,SAASC;YAChC,OAAOA,aAAaC,SAChBD,aAAaC,MAAMzE,SAAS,KAC5BwE,aAAaC,MAAM,GAAGC;;QAG9BzK,GAAG0K,0BAA0B;YACzB,QAAQ1K,GAAG2K,kBACP3K,GAAG2J,2BACFhB,KAAKjC,UAAUwB,UAAU/D,aAAawE,KAAKjC,UAAUkE,gBAAgBzG,aAAawE,KAAKjC,UAAUmE,aAAa1G;;QAGvHnE,GAAG8K,YAAY,SAASC,YAAYC,OAAOC;YACvC,IAAIC,SAASH,WAAW7C,SAAS6C,WAAWF,YAAYE,WAAWH;YAEnE,OAAOM,OAAOtE,KAAKmE,YAAYC,OAAOC;;QAG1CjL,GAAGmL,mBAAmB,SAASnE;YAC3B,IAAIoE,aAAa,IACbC,QAAQ,IAAIrF,WAAWgB;YAE3BhH,GAAG+C,KAAKsI,OAAO,SAASrI,KAAKsI;gBACzB,IAAIC,eAAeD,IAAI3E,SAAS;gBAEhC,IAAI4E,aAAaxF,SAAS,GAAG;oBACzBwF,eAAe,MAAMA;;gBAGzBH,cAAcG;;YAGlB,OAAOH;;QAGXpL,GAAGwL,gBAAgB,SAASC,MAAMC,aAAa3F;YAC3C,IAAI4F,cAAc3L,GAAG8K,UAAUW,MAAMC,aAAaA,cAAc3F,SAC5D6F,aAAa,IAAIC,cACjBC,UAAU,IAAI9L,GAAG+L;YAErBH,WAAWI,SAAS;gBAChBF,QAAQG,QAAQjM,GAAGmL,iBAAiBS,WAAWjJ;;YAGnDiJ,WAAWM,UAAUJ,QAAQK;YAE7BP,WAAWQ,kBAAkBT;YAE7B,OAAOG;;QAGX9L,GAAG6B,SAAS,SAASY,OAAO4J,QAAQC;YAChCtM,GAAG+C,KAAKsJ,QAAQ,SAASE,MAAMtJ;gBAC3B,IAAIqJ,gBAAgBtM,GAAGuG,SAAStD,MAAM;oBAClC,IAAIR,MAAM8J,UAAUpI,WAAW;wBAC3B1B,MAAM8J;;oBAEVvM,GAAG6B,OAAOY,MAAM8J,OAAOtJ,KAAK;uBAE3B;oBACDR,MAAM8J,QAAQtJ;;;YAItB,OAAOR;;QAaXzC,GAAGwM,WAAW,SAASC,QAAQC;YAC3B,IAAIC,aACAC,SAASF,SAASC;YAEtB3M,GAAG+C,KAAK6J,QAAQ,SAASC,aAAaC;gBAClC,IAAIL,OAAOI,iBAAiB1I,WAAW;oBACnCwI,OAAOE,eAAeJ,OAAOI;;gBAGjCJ,OAAOI,eAAeC;;YAG1B,OAAOL;;QAMXzM,GAAG2F,UAAU,SAASoH,KAAKC,KAAKC;YAC5B,IAAIF,IAAIpH,SAAS;gBACb,OAAOoH,IAAIpH,QAAQqH,KAAKC;;YAG5BA,OAAOA,QAAQ;YACf,IAAIC,MAAMH,IAAIhH;YAEd,IAAIkH,OAAO,GAAG;gBACVA,QAAQC;;YAGZ,MAAOD,OAAOC,KAAKD,QAAQ,GAAG;gBAC1B,IAAIF,IAAII,eAAeF,SAASF,IAAIE,UAAUD,KAAK;oBAC/C,OAAOC;;;YAGf,QAAQ;;QAIZjN,GAAGoN,cAAc;YACb,OAAO,uCAAuC7K,QAAQ,SAAS,SAAS8K;gBAEpE,IAAIC,IAAI3L,KAAK4L,WAAW,KAAK,GAAGC,IAAIH,KAAK,MAAMC,IAAKA,IAAI,IAAM;gBAC9D,OAAOE,EAAE7G,SAAS;;;QAM1B3G,GAAGyN,KAAK;YACJ,OAAOC,UAAUC,UAAUhI,QAAQ,aAAa,KAC5C+H,UAAUC,UAAUhI,QAAQ,gBAAgB;;QAGpD3F,GAAG4N,MAAM;YACL,OAAOF,UAAUC,UAAUhI,QAAQ,eAAe;;QAGtD3F,GAAG6N,MAAM;YACL,OAAOH,UAAUC,UAAUhI,QAAQ,eAAe;;QAGtD3F,GAAG8N,OAAO;YACN,OAAOJ,UAAUC,UAAUhI,QAAQ,gBAAgB;;QAGvD3F,GAAG+N,OAAO;YACN,OAAO/N,GAAGyN,QAAQC,UAAUC,UAAUhI,QAAQ,cAAc;;QAGhE3F,GAAGgO,OAAO;YACN,OAAON,UAAUC,UAAUhI,QAAQ,WAAW;;QAGlD3F,GAAGiO,SAAS;YACR,OAAOP,UAAUQ,WAAW/J,aAAauJ,UAAUQ,OAAOvI,QAAQ,cAAc;;QAGpF3F,GAAGmO,SAAS;YACR,OAAOT,UAAUQ,WAAW/J,aAAauJ,UAAUQ,OAAOvI,QAAQ,eAAe;;QAGrF3F,GAAGoO,QAAQ;YACP,OAAOV,UAAUQ,WAAW/J,aAAauJ,UAAUQ,OAAOvI,QAAQ,cAAc;;QAGpF3F,GAAGqO,UAAU;YACT,QAASrO,GAAGgO,WAAWhO,GAAG+N,UAAUL,UAAUC,UAAUhI,QAAQ,gBAAgB,KAAK+H,UAAUQ,WAAW/J,aAAauJ,UAAUQ,WAAW;;QAGhJlO,GAAGsO,UAAU;YACT,OAAOZ,UAAUa,aAAa;;QAGlCvO,GAAGwO,UAAU;YACT,OAAOd,UAAUC,UAAUrE,cAAc3D,QAAQ,gBAAgB;;QAKrE3F,GAAG2K,eAAe;YACd,OAAO3K,GAAGwO,aAAad,UAAUC,UAAUrE,cAAc3D,QAAQ,YAAY;;QAGjF3F,GAAGyO,OAAO;YACN,OAAOzO,GAAG0O,SAAShB,UAAUC,UAAUhI,QAAQ,eAAe;;QAGlE3F,GAAG2O,OAAO;YACN,OAAO3O,GAAG0O,SAAShB,UAAUC,UAAUhI,QAAQ,eAAe;;QAGlE3F,GAAG4O,OAAO;YACN,OAAO5O,GAAG0O,SAAShB,UAAUC,UAAUhI,QAAQ,eAAe;;QAIlE3F,GAAG6O,SAAS;YACR,OAAO7O,GAAG0O,SAAShB,UAAUC,UAAUhI,QAAQ,iBAAiB;;QAGpE3F,GAAG0O,MAAM;YAEL,OAAOhB,UAAUC,UAAUhI,QAAQ,aAAa,KACzC+H,UAAUC,UAAUhI,QAAQ,aAAa,KACzC+H,UAAUC,UAAUhI,QAAQ,eAAe;;QAGtD3F,GAAG8O,YAAY;YACX,OAAO9O,GAAG0O,SAAShB,UAAUC,UAAUhI,QAAQ,cAAc;;QAGjE3F,GAAG+O,YAAY;YACX,OAAO/O,GAAG0O,UAAU1O,GAAG8O,eAAepB,UAAUC,UAAUhI,QAAQ,eAAe;;QAGrF3F,GAAGgP,mBAAmB;YAClB,OAAOhP,GAAG0O,UAAU1O,GAAG8O,gBAAgB9O,GAAG+O;;QAM9C/O,GAAGiP,iBAAiB,SAASC;YACzB,IAAIA,EAAED,gBAAgB;gBAClBC,EAAED;mBACC;gBACHC,EAAEC,cAAc;;;QAQxBnP,GAAGoP,YAAa;YACZ,IAAIC,MAAMxF,SAASC,cAAc;YACjC,OAAO,SAASwF;gBACZD,IAAIE,YAAYD;gBAChB,IAAIrP,UAAUoP,IAAI/L;gBAClB+L,IAAIhO,YAAYpB;gBAChB,OAAOA;;;QAKfD,GAAG+C,OAAO,SAASyM,cAAcC;YAC7B,IAAIC,YAAYC;YAEhB,IAAIH,cAAc;gBAEd,IAAIxK,OAAO4K,WAAWJ,aAAavI,gBAAgBjC,OAAO4K,SAAS;oBAC/D,KAAKF,aAAa,GAAGA,aAAaF,aAAazJ,QAAQ2J,cAAc;wBACjEC,SAASF,SAASD,aAAaK,IAAIH,aAAaF,aAAaM,QAAQN,aAAaK,IAAIH;wBACtF,IAAIC,WAAW,OAAO;4BAClB;;;uBAMP,IAAI3P,GAAG8G,QAAQ0I,iBAAiBxP,GAAGkH,WAAWsI,iBAAiBxP,GAAGoH,WAAWoI,eAAe;oBAC7F,KAAKE,aAAa,GAAGA,aAAaF,aAAazJ,QAAQ2J,cAAc;wBACjEC,SAASF,SAASC,YAAYF,aAAaE;wBAC3C,IAAIC,WAAW,OAAO;4BAClB;;;uBAIP,IAAI3P,GAAGwH,SAASgI,eAAe;oBAChC,KAAKE,aAAa,GAAGA,aAAaF,aAAazJ,QAAQ2J,cAAc;wBACjEC,SAASF,SAASC,YAAYF,aAAaO,OAAOL;wBAClD,IAAIC,WAAW,OAAO;4BAClB;;;uBAIP;oBACD,KAAKD,cAAcF,cAAc;wBAC7B,IAAI/I,OAAOC,UAAUyG,eAAevG,KAAK4I,cAAcE,aAAa;4BAChEC,SAASF,SAASC,YAAYF,aAAaE;4BAC3C,IAAIC,WAAW,OAAO;gCAClB;;;;;;;QASxB3P,GAAGgQ,OAAO,SAASC,SAASC;YACxB,IAAIlQ,GAAG6G,WAAWoJ,UAAU;gBACxB,IAAIjI,OAAQC,MAAMvB,UAAUwB,MAAMtB,KAAKuB,WAAW;gBAElD,OAAO;oBACH,IAAIgI,UAAUnQ,GAAG6B,WAAWmG;oBAC5B,IAAIG,UAAUpC,QAAQ;wBAClBoK,UAAUA,QAAQC,OAAOnI,MAAMvB,UAAUwB,MAAMtB,KAAKuB;;oBAExD,OAAO8H,QAAQI,MAAMH,SAASC;;;YAItC,MAAM,IAAI3O,MAAM;;QAmBpBxB,GAAGsQ,UAAU,SAASC,KAAKC,MAAMC;YAE7B,IAAIC,iBACAC,SAAS,KACTC,MAAM,SAASC,SAASC;gBACpB,IAAIC,WAAWP,OACR,QAAQrO,KAAKqO,QACdA,OACAA,OAAO,MAAMM,IAAI,MACjBA;gBACN,IAAKC,aAAa,eAAiBD,MAAM,aAAc;oBACnDJ,WAAWxN,YACC2N,YAAY,WACd7Q,GAAGsQ,QAAQO,SAASE,UAAU,QAC7BtK,OAAOC,UAAUC,SAASC,KAAKiK,aAAa,sBAC7CG,mBAAmBD,YAAY,MAAMC,mBAAmBH,aACxDG,mBAAmBD,YAAY,MAAMC,mBAAmBH;;;YAK9E,KAAKJ,cAAcD,MAAM;gBACrBG,SAAU,KAAKxO,KAAKqO,QAAU,MAAMrO,KAAKqO,QAAS,KAAK,MAAM;gBAC7DE,WAAWxN,KAAKsN;gBAChBE,WAAWxN,KAAKlD,GAAGsQ,QAAQC;mBACxB,IAAK9J,OAAOC,UAAUC,SAASC,KAAK2J,SAAS,2BAA6BA,QAAQ,aAAc;gBACnGvQ,GAAG+C,KAAKwN,KAAK,SAASvN,KAAKC;oBACvB2N,IAAI3N,KAAKD;;mBAEV,WAAYuN,QAAQ,eAAiBA,QAAQ,eAAiBA,QAAQ,UAAW;gBACpFvQ,GAAG+C,KAAKwN,KAAK,SAAShE,MAAMtJ;oBACxB2N,IAAI3N,KAAKsJ;;mBAEV;gBACHmE,WAAWxN,KAAK8N,mBAAmBR,QAAQ,MAAMQ,mBAAmBT;;YAGxE,IAAIC,MAAM;gBACN,OAAOE,WAAWO,KAAKN;mBACpB;gBACH,OAAOD,WAAWO,KAAKN,QAClBpO,QAAQ,MAAM,IACdA,QAAQ,QAAQ;;;QAI7BvC,GAAGkR,eAAe,SAASX,KAAKY,UAAUC;YACtC,KAAKD,UAAU;gBACXA,WAAW,IAAInH;;YAGnBhK,GAAG+C,KAAKwN,KAAK,SAASV,KAAK5M;gBACvB4M,MAAMuB,eAAeA,eAAe,MAAMvB,MAAM,MAAMA;gBAEtD,IAAI7P,GAAGuG,SAAStD,MAAM;oBAClBjD,GAAGkR,aAAajO,KAAKkO,UAAUtB;uBAE9B,IAAI7P,GAAG6G,WAAW5D,MAAM;oBACzBkO,SAAS9L,OAAOwK,KAAK5M;uBAEpB;oBACDkO,SAAS9L,OAAOwK,KAAK5M;;;YAI7B,OAAOkO;;QAGXnR,GAAGqR,aAAa,SAASd,KAAKe;YAC1B,IAAI1H;YAEJ,KAAK0H,MAAM;gBACPA,OAAOzH,SAASC,cAAc;;YAGlC9J,GAAGkR,aAAaX;gBACZlL,QAAQ,SAASwK,KAAK5M;oBAClB2G,QAAQC,SAASC,cAAc;oBAC/BF,MAAM2H,aAAa,QAAQ1B;oBAC3BjG,MAAM2H,aAAa,SAAStO;oBAC5BqO,KAAKE,YAAY5H;;;YAIzB,OAAO0H;;QAOXtR,GAAGyR,YAAY,SAASC;YAEpB,IAAI1M,OAAO2M,QAAQ3R,GAAG6G,WAAW8K,KAAKC,QAAQ;gBAC1C,OAAOD,KAAKC,MAAMF;mBACf;gBACH,OAAOG,KAAK,MAAMH,OAAO;;;QAUjC1R,GAAG8R,eAAe,SAASC;YACvB,IAAIC,SAASD,SAASE,YAAY,OAAO;YAEzC,IAAID,SAAS,GAAG;gBACZ,OAAOD,SAASG,OAAOF,QAAQD,SAAShM,SAASiM;;;QAIzDhS,GAAGmS,cAAc,SAASC;YAGtB,IAAIpS,GAAGiJ,QAAQmJ,kBAAkB;gBAE7B,OAAOA,gBAAgBrL,MAAMxE,QAAQ,aAAa;mBAEjD,IAAIvC,GAAGyI,OAAO2J,kBAAkB;gBACjC,IAAIA,gBAAgBC,aAAa,QAAQD,gBAAgBC,aAAalO,WAAW;oBAC7E,OAAOiO,gBAAgBC;;;YAI/B,OAAOD,gBAAgBrQ;;QAM3B/B,GAAGsS,iBAAiB;YAChB,IAAIC;YAEJ;gBAEIC,SAAS;oBACL,IAAIC;oBACJ,GAAG;wBACCA,WAAWF,UAAUG;wBACrB,IAAID,UAAU;4BACVA;;6BAGDA;;gBAIXnS,QAAQ;oBACJ,IAAI0H,OAAOG;oBAEX9H,KAAKsS,YAAY3S,GAAGgI,KAAK,IAAI1H,OAAO+P,MAAMhQ,MAAM4H,MAAMvB,UAAUwB,MAAMtB,KAAKuB,WAAW;;gBAI1FwK,aAAa,SAASC;oBAClBL,UAAUrP,KAAK0P;;;;;KCt2B9B;QACG;QACA,WAAWC,WAAW,cAAcA,OAAOC,KAAK;YAC5CD,OAAO;gBACH,OAAO7S;;eAGV,WAAW+S,WAAW,eAAeA,OAAOC,SAAS;YACtDD,OAAOC,UAAUhT;eAEhB;YACDD,OAAOC,KAAKA;;;ICXpBA,GAAGiT,UAAU;ICAbjT,GAAGkT,oBAAqB;QACpB;QAEA,IAAIC,mBACAC,wBACAC,kBACAC,2BACAC,oBACAC,kBACAC,gBACAC,wBACAC,oBACAC,uBACAC,2BACAC,wBACAC,yBACAC,uBACAC;QAEJ,SAASC;YACL,IAAIC,YAAY,MACZC;YAEJ;gBACIA,YAAYvK,SAASC,cAAc;gBACnCsK,UAAU7T,OAAO;gBACjBP,GAAGoU,WAAWlU;gBAEd,IAAIkU,UAAUC,UAAU;oBACpBF,YAAY;;cAGpB,OAAOG;gBACHH,YAAY;;YAGhB,OAAOA;;QAIX,SAASI;YACL,QAAQvU,GAAGmO,YAAYnO,GAAGoO,YACtBV,UAAUC,UAAU6G,MAAM,2CAA2CrQ;;QAI7E,SAASsQ;YACL,IAAIzP,OAAOmF,gBAAgB;gBACvB,IAAIuK,MAAM1U,GAAGiK;gBAGb,OAAOyK,IAAIC,oBAAoBxQ;;YAGnC,OAAO;;QAIX,SAASyQ;YACL,OAAO5P,OAAO6P,mBAAmB1Q;;QAKrC,SAAS2Q;YACL,IAAIL,6BAA6B;gBAC7B,OAAO;;YAGX,OAAOG;;QAGX,SAASG;YAEL,OAAOlL,SAASC,cAAc,SAASkL,oBAAoB7Q;;QAG/D,SAAS8Q;YACL;gBACI,SAASjQ,OAAOkQ,gBAEZlV,GAAG6G,WAAW7B,OAAOkQ,aAAaC;cAE1C,OAAO9K;gBAEH,OAAO;;;QAIf,SAAS+K;YACL,IAAIC,OAAOxL,SAASC,cAAc;YAElC,QAAQ,eAAeuL,QAAS,iBAAiBA,QAAQ,YAAYA,UAChErV,GAAGwO,cAAcxO,GAAG0O;;QAG7ByE,oBAAoBe;QAEpBZ,4BAA4BH,qBAAqBnT,GAAG2J;QAEpDyJ,yBAAyBE,8BAA8BtT,GAAG2K;QAE1D0I,mBAAmBC,6BAA6B8B;QAGhD7B,qBAAqBF,oBAAqB;YACtC,IAAIzJ,QAAQC,SAASC,cAAc;YAEnCF,MAAMrJ,OAAO;YACb,UAAU,sBAAsBqJ,SAASC,SAAShH,iBAAiB,oBAAoB;;QAG3F2Q,mBAAmBF,6BAA6BtT,GAAG0K;QAEnD+I,iBAAiBH,6BAA6BE,oBAAoByB;QAElEvB,yBAAyBJ,6BAA6BiB;QAEtDZ,qBAAqBR,sBAAsBnO,OAAOsQ,gBAAgBnR,aAAamP;QAE/EO,4BAA4BY;QAE5Bb,wBAAwBgB;QAExBd,yBAAyBgB;QAEzBf,0BAA0BgB;QAE1Bf,wBAAwBV,6BAA6BtO,OAAO6G,eAAe1H;QAE3E8P,yBAA0B;YACtB,IAAIX,2BAA2B;gBAC3B,QAAQtT,GAAG2K,mBAAmB3K,GAAG8O;;YAErC,OAAO;;QAGX;YACIyG,eAAejC;YACfkC,eAAepC;YACfqC,kBAAkBnC;YAClBoC,UAAUlC;YACVmC,gBAAgB7B;YAChB8B,mBAAmBhC;YACnBiC,mBAAmBhC;YACnBiC,iBAAiB9Q,OAAO+Q;YACxBC,UAAU3C;YACV4C,YAAY1C;YACZ2C,iBAAiBnC;YACjBoC,eAAenC;YACfoC,iBAAiBpC;YACjBqC,oBAAoB/C;YACpBgD,OAAO9C;YACP+C,aAAatC;YACbuC,QAAQ/C;YACRgD,SAASzC,yBAAyBZ;YAClCsD,cAAc1W,GAAGiO;YACjB0I,2BAA2B3W,GAAG0O;YAC9BkI,WAAWzD;YACX0D,YAAYlD;YACZmD,qBAAqBxD;YACrByD,oBAAoBzD;YACpB0D,gBAAgBtD;;;IChKxB1T,GAAGiX,mBAAmB,SAASC;QAC3B;QACA,UAAUA,gBAAgBA,aAAaC,QAAQnX,GAAG6G,WAAWqQ,aAAaC;;IAG9EnX,GAAG+L,UAAU;QACT;QAEA,IAAIqL,aAAaC,aACbC,uBACAC,uBACAC,oBACAC,QAAQ;QAEZzX,GAAG6B,OAAOxB;YACN8W,MAAM,SAASO,WAAWC;gBACtB,IAAIF,UAAU,GAAG;oBACb,IAAIC,WAAW;wBACXJ,iBAAiBpU,KAAKwU;;oBAE1B,IAAIC,WAAW;wBACXJ,iBAAiBrU,KAAKyU;;uBAGzB,IAAIF,WAAW,GAAG;oBACnBE,aAAaA,UAAUtH,MAAM,MAAMgH;uBAElC,IAAIK,WAAW;oBAChBA,UAAUrH,MAAM,MAAM+G;;gBAG1B,OAAO/W;;YAGXuX,MAAM,SAASnI;gBACX,IAAIgI,UAAU,GAAG;oBACbD,cAActU,KAAKuM;uBAElB;oBACDA,SAASY,MAAM,MAAMgH,gBAAgBlT,YAAYiT,cAAcC;;gBAGnE,OAAOhX;;YAGX4L,SAAS;gBACLwL,QAAQ;gBACRL,cAAcjP;gBAEd,IAAImP,iBAAiBvR,QAAQ;oBACzB/F,GAAG+C,KAAKuU,kBAAkB,SAAStU,KAAKyM;wBACpCA,SAASY,MAAM,MAAM+G;;;gBAI7B,IAAII,cAAczR,QAAQ;oBACtB/F,GAAG+C,KAAKyU,eAAe,SAASxU,KAAKyM;wBACjCA,SAASY,MAAM,MAAM+G;;;gBAI7B,OAAO/W;;YAGX8L,SAAS;gBACLsL,SAAS;gBACTJ,cAAclP;gBAEd,IAAIoP,iBAAiBxR,QAAQ;oBACzB/F,GAAG+C,KAAKwU,kBAAkB,SAASvU,KAAKyM;wBACpCA,SAASY,MAAM,MAAMgH;;;gBAI7B,IAAIG,cAAczR,QAAQ;oBACtB/F,GAAG+C,KAAKyU,eAAe,SAASxU,KAAKyM;wBACjCA,SAASY,MAAM,MAAMgH;;;gBAI7B,OAAOhX;;;;IClFnBL,GAAG6X,cAAc,SAASC;QACtB;QAEA,IAAIC,SACAC,wBAAwB,gBACxBC,yBAAyB,oBACzBC,sBACAC,mBACAC,iBAAiB,IAAIpY,GAAGsS;QAE5ByF;YACIM;YACAC,oBAAoB;YACpBC;gBACIC,YAAY;;YAEhBC,WAAW,IAAIzY,GAAG6X,YAAYY;;QAGlCzY,GAAG6B,OAAOkW,SAASD,GAAG;QAEtB,SAASY,mBAAmBC,OAAOC;YAE/B,IAAIC,eAAe5Q,MAAMvB,UAAUwB,MAAMtB,KAAK+R;YAE9CZ,QAAQU,UAAUK,QAAQ,aAAaH,MAAM5S,SAAS;YACtD6S,eAAeG,aAAa;YAC5BhB,QAAQU,UAAUO,+BAA+BH,cAAcD,eAAeK;;QAGlF,SAASC,iBAAiBC;YACtB,IAAIC,oBAAoB,IAAIpZ,GAAG+L;YAE/B,IAAIoN,MAAM1Q,QAAQ;gBACd0Q,MAAME,KAAK,SAASA;oBAChBA,KAAKC,SAASC,qBAAqBJ;oBACnChB,aAAajV,KAAKmW;oBAClBD,kBAAkBnN;mBAEtB,SAASuN;oBACLzB,QAAQU,UAAUK,QAAQ,sBAAsBK,MAAMM,WAAW,wBAAwBD,UAAUE,OAAO,KAAK;oBAC/GN,kBAAkBjN;;mBAGrB,IAAIgN,MAAMQ,aAAa;gBACxBC,oBAAoBT,OAAOhC,KACvB,SAAS0C,eAAeC;oBACpB,IAAIC,cAAcD,QAAQ/T;oBAE1B/F,GAAG+C,KAAK+W,SAAS,SAAS9W,KAAKmW;wBAC3BD,iBAAiBC,OAAOvB,KAAK;4BACzBmC,eAAe;4BAEf,IAAIA,gBAAgB,GAAG;gCACnBX,kBAAkBnN;;;;oBAK9B,KAAK6N,QAAQ/T,QAAQ;wBACjBqT,kBAAkBnN;;mBAI1B,SAAS+N,YAAYR;oBACjBzB,QAAQU,UAAUK,QAAQ,sBAAsBK,MAAMM,WAAW,wBAAwBD,UAAUE,OAAO,KAAK;oBAC/GN,kBAAkBjN;;;YAK9B,OAAOiN;;QAGX,SAASG,qBAAqBJ;YAC1B,IAAIpX,OAAOoX,MAAMpX,MACb0X,WAAWN,MAAMM,UACjBQ,wBAAwBR,SAASxH,YAAYlQ;YAGjD0X,WAAWA,SAASvH,OAAO,GAAG+H;YAG9B,IAAIR,SAAS1J,OAAO,OAAO,KAAK;gBAC5B0J,WAAWA,SAASvH,OAAO;;YAG/B,OAAOuH;;QAIX,SAASG,oBAAoBT,OAAOe,QAAQC,cAAcC;YACtD,IAAItO,UAAUsO,mBAAmB,IAAIpa,GAAG+L,WACpCsO,YAAYH,UAAUf,MAAMmB;YAEhCD,UAAUE,YACN,SAASC,YAAYV;gBACjB,IAAIW,aAAaN,eAAeA,aAAa/J,OAAO0J,WAAWA;gBAE/D,IAAIA,QAAQ/T,QAAQ;oBAChB2U,WAAW;wBACPd,oBAAoBT,OAAOkB,WAAWI,YAAY3O;uBACnD;uBAEF;oBACDA,QAAQG,QAAQwO;;eAIxB3O,QAAQK;YAGZ,OAAOL;;QAGX,SAAS6O,mBAAmBpQ,cAAcqO;YACtC,IAAIgC,4BACAC,4BAA4B,IAAI7a,GAAG+L;YAEvCgM,QAAQU,UAAUqC;YAClBlC,eAAeG,aAAa;YAE5B,IAAIxO,aAAaoO,MAAM5S,SAAS,MAAMgS,QAAQO,oBAAoB;gBAC9DP,QAAQU,UAAUO;gBAClBjB,QAAQU,UAAUsC,UAAU,qBAAqB;gBACjDnC,eAAeG,aAAa;gBAC5B8B,0BAA0B1O;mBAEzB;gBACDgM;gBAEA,IAAInY,GAAGsK,sBAAsBC,eAAe;oBACxCvK,GAAG+C,KAAKwH,aAAaC,OAAO,SAASxH,KAAKsE;wBACtC,IAAI6R,QAAQ7R,KAAKmD;wBAEjB,IAAI0O,OAAO;4BAEP,IAAIA,MAAM1Q,QAAQ;gCACd0P,aAAajV,KAAKoE,KAAK0T;mCAGtB;gCACDJ,sBAAsB1X,KAAKgW,iBAAiBC,OAAOvB,KAAK;oCACpDgD,sBAAsBK;oCACtB,IAAIL,sBAAsB7U,WAAW,GAAG;wCACpC8U,0BAA0B5O;;;;;;uBAO7C;oBACDkM,eAAe5N,aAAaoO;;gBAGhC,IAAIiC,sBAAsB7U,WAAW,GAAG;oBACpC8U,0BAA0B5O;;;YAIlC,OAAO4O;;QAGX,SAASK,cAAcC;YACnB,IAAIC,WAAW,IAAIpb,GAAGqb;gBAClBrD,uBAAuBA;gBACvB/X,SAASkb;gBACTG,SAAS,SAASpM;oBACdlP,GAAGmb,UAAU9Y,SAAS0V,QAAQQ,QAAQC;oBACtCtJ,EAAEqM;;gBAENC,uBAAuB,SAAStM;oBAC5BlP,GAAGmb,UAAU7Y,YAAYyV,QAAQQ,QAAQC;;gBAE7CiD,QAAQ,SAASvM;oBACbyL,mBAAmBzL,EAAE3E,cAAc6Q,UAAUjE,KACzC;wBACIuB,mBAAmBP,cAAciD;uBAErC;wBACIrD,QAAQU,UAAUK,QAAQ,uEAAuE;;;;YAMjHV,eAAezF,YAAY;gBACvByI,SAAS5I;;YAGbxS,GAAGmb,UAAUrX,aAAamU,2BAA2BjY,GAAGmb,UAAUjb;YAElEgY,gBAAgBhV,KAAKkY;YAErB,OAAOA;;QAGX,SAASM,WAAWC;YAChB,IAAIC;YAEJ5b,GAAG+C,KAAK4Y,UAAUpR,aAAasR,OAAO,SAAShM,KAAK5M;gBAChD,IAAIA,QAAQ,SAAS;oBACjB2Y,WAAW;oBACX,OAAO;;;YAIf,OAAOA;;QAWX,SAASE,mBAAmB5M;YACxB,IAAIlP,GAAGiO,UAAU;gBACb,OAAOiB,EAAE6M,IAAI,KAAK7M,EAAE8M,IAAI;;YAG5B,OAAO9M,EAAE6M,MAAM,KAAK7M,EAAE8M,MAAM;;QAGhC,SAASC;YACL,IAAIC,YAAYnE,QAAQM,kBAEpB8D,qBAAqB;gBACjBzB,WAAW;oBACP1a,GAAG+C,KAAKmZ,WAAW,SAASlZ,KAAKoY;wBAC7Bpb,GAAGob,UAAUtX,aAAamU,2BAA2BjY,GAAGob,UAAUlb;wBAClEF,GAAGob,UAAU9Y,YAAYyV,QAAQQ,QAAQC;;mBAE9C;;YAGXxY,GAAG+C,KAAKmZ,WAAW,SAASlZ,KAAKoY;gBAC7B,IAAIxC,iBAAiBsC,cAAcE;gBAGnC,IAAIc,UAAUnW,UAAU/F,GAAGkT,kBAAkB8C,UAAU;oBACnDoC,eAAe9X,OAAOuJ,UAAU,aAAa,SAASqF;wBAClD,KAAK0J,eAAeG,kBAAkB2C,WAAWxM,IAAI;4BACjDlP,GAAG+C,KAAKmZ,WAAW,SAASlZ,KAAKoY;gCAG7B,IAAIA,oBAAoBgB,eACpBpc,GAAGob,UAAUtX,aAAamU,yBAAyB;oCAEnDjY,GAAGob,UAAU9Z;wCAAKlB,SAAS;;;;;;;;YAQnDgY,eAAe9X,OAAOuJ,UAAU,aAAa,SAASqF;gBAClD,IAAI4M,mBAAmB5M,IAAI;oBACvBiN;;;YAOR/D,eAAe9X,OAAON,GAAG6J,UAAUzG,WAAW,IAAI,cAAc,SAAS8L;gBACrEiN;;YAGJ/D,eAAe9X,OAAOuJ,UAAU,QAAQ,SAASqF;gBAC7C,IAAIwM,WAAWxM,IAAI;oBACfA,EAAED;oBACFkN;;;YAIR/D,eAAe9X,OAAOuJ,UAAUmO,uBAAuBmE;;QAG3DF;QAEAjc,GAAG6B,OAAOxB;YACNgc,oBAAoB,SAASpc;gBACzB8X,QAAQM,iBAAiBnV,KAAKjD;gBAC9Bib,cAAcjb;;YAGlBqc,gBAAgB,SAASrc;gBACrB,IAAI6Q,GACAyL,MAAMxE,QAAQM;gBAElB,KAAKvH,KAAKyL,KAAK;oBACX,IAAIA,IAAIzL,OAAO7Q,SAAS;wBACpB,OAAOsc,IAAIC,OAAO1L,GAAG;;;;YAKjC0B,SAAS;gBACL4F,eAAe5F;gBACfxS,GAAG+C,KAAKmV,iBAAiB,SAASlV,KAAKoY;oBACnCA,SAAS5I;;;;QAKrBnS,KAAKoc;QACLpc,KAAKoc,SAASlD,uBAAuBA;;IAGzCvZ,GAAG6X,YAAYY,YAAY;QACvB;QAEA;YACIqC,wBAAwB;YACxB9B,gCAAgC,SAASL,OAAO+D;YAChD3B,WAAW,SAASrB,MAAMiD;gBACtB3c,GAAGmG,IAAI,6BAA6BuT,OAAO,6BAA6BiD,iBAAiB,KAAK;;YAElG7D,SAAS,SAAS1S,SAASC;gBACvBrG,GAAGmG,IAAIC,SAASC;;;;IAK5BrG,GAAGqb,iBAAiB,SAASvD;QACzB;QAEA,IAAIM,iBAAiB,IAAIpY,GAAGsS,kBACxByF,SAAS9X,SAAS2c,aAAaC;QAEnC9E;YACI9X,SAAS;YACTqb,SAAS,SAASpM;YAClB4N,SAAS,SAAS5N;YAElBsM,uBAAuB,SAAStM;YAChCuM,QAAQ,SAASvM;;QAGrBlP,GAAG6B,OAAOkW,SAASD;QACnB7X,UAAU8X,QAAQ9X;QAElB,SAAS8c;YACL,OAAO/c,GAAGiO,YAAajO,GAAGqO,aAAarO,GAAGsO;;QAG9C,SAAS0O,mBAAmB9N;YAExB,KAAK2N,qBAAqB;gBAGtB,IAAIE,0BAA0B;oBAC1B3E,eAAe9X,OAAOuJ,UAAU,YAAY,SAASqF;wBACjDA,EAAED;;uBAEH;oBACHmJ,eAAe9X,OAAOuJ,UAAU,YAAY,SAASqF;wBACjD,IAAIA,EAAE3E,cAAc;4BAChB2E,EAAE3E,aAAa0S,aAAa;4BAC5B/N,EAAED;;;;gBAKd4N,sBAAsB;;;QAI9B,SAASK,gBAAgBhO;YAGrB,KAAKlP,GAAGkT,kBAAkB8C,UAAU;gBAChC,OAAO;;YAGX,IAAImH,YAAYC,KAAKlO,EAAE3E,cAEvB8S,WAAWrd,GAAGiO;YAMdkP,aAAand,GAAGyN,QAAQzN,GAAGkT,kBAAkB8C,WAAW,OAAOoH,GAAGE,kBAAkB;YACpF,OAAOF,MAAMD,eAEAC,GAAGzE,SAASyE,GAAGzE,MAAM5S,WACpBsX,YAAYD,GAAGvB,MAAM/a,YAAYsc,GAAGvB,MAAM/a,SAAS,YACpDsc,GAAGvB,MAAM0B,YAAYH,GAAGvB,MAAM0B,SAAS;;QAIxD,SAASC,oBAAoBC;YACzB,IAAIA,eAAetZ,WAAW;gBAC1ByY,cAAca;;YAElB,OAAOb;;QAGX,SAASc;YACL,IAAIC;YAEJ,SAASC;gBACLD,iBAAiB9T,SAASgU,YAAY;gBACtCF,eAAeG,UAAU/F,QAAQC,uBAAuB,MAAM;;YAGlE,IAAIhT,OAAO+Y,aAAa;gBACpB;oBACIJ,iBAAiB,IAAII,YAAYhG,QAAQC;kBAE7C,OAAOgG;oBACHJ;;mBAGH;gBACDA;;YAGJ/T,SAASoU,cAAcN;;QAG3B,SAASO;YACL9F,eAAe9X,OAAOL,SAAS,YAAY,SAASiP;gBAChD,KAAKgO,gBAAgBhO,IAAI;oBACrB;;gBAKJ,IAAIiP,SAASne,GAAGyN,QAAQzN,GAAGkT,kBAAkB8C,WAAW,OAAO9G,EAAE3E,aAAa+S;gBAC9E,IAAIa,WAAW,UAAUA,WAAW,YAAY;oBAC5CjP,EAAE3E,aAAa0S,aAAa;uBACzB;oBACH/N,EAAE3E,aAAa0S,aAAa;;gBAGhC/N,EAAEqM;gBACFrM,EAAED;;YAGNmJ,eAAe9X,OAAOL,SAAS,aAAa,SAASiP;gBACjD,KAAKsO,uBAAuB;oBACxB,KAAKN,gBAAgBhO,IAAI;wBACrB;;oBAEJ6I,QAAQuD,QAAQpM;;;YAIxBkJ,eAAe9X,OAAOL,SAAS,aAAa,SAASiP;gBACjD,KAAKgO,gBAAgBhO,IAAI;oBACrB;;gBAGJ6I,QAAQ+E,QAAQ5N;gBAEhB,IAAIkP,gBAAgBvU,SAASwU,iBAAiBnP,EAAEoP,SAASpP,EAAEqP;gBAE3D,IAAIve,GAAGK,MAAMS,SAASsd,gBAAgB;oBAClC;;gBAGJrG,QAAQyD,sBAAsBtM;;YAGlCkJ,eAAe9X,OAAOL,SAAS,QAAQ,SAASiP;gBAC5C,KAAKsO,uBAAuB;oBACxB,KAAKN,gBAAgBhO,IAAI;wBACrB;;oBAGJA,EAAED;oBACFC,EAAEqM;oBACFxD,QAAQ0D,OAAOvM;oBAEfwO;;;;QAKZV;QACAkB;QAEAle,GAAG6B,OAAOxB;YACN0Y,cAAc,SAAS0E;gBACnB,OAAOD,oBAAoBC;;YAG/BjL,SAAS;gBACL4F,eAAe5F;;YAGnByG,YAAY;gBACR,OAAOhZ;;;QAIfI,KAAKoc;QACLpc,KAAKoc,SAASS,kBAAkBA;;GNzfLlY","file":"dnd.js","sourcesContent":[null,"/*globals window, navigator, document, FormData, File, HTMLInputElement, XMLHttpRequest, Blob, Storage, ActiveXObject */\n/* jshint -W079 */\nvar qq = function(element) {\n \"use strict\";\n\n return {\n hide: function() {\n element.style.display = \"none\";\n return this;\n },\n\n /** Returns the function which detaches attached event */\n attach: function(type, fn) {\n if (element.addEventListener) {\n element.addEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.attachEvent(\"on\" + type, fn);\n }\n return function() {\n qq(element).detach(type, fn);\n };\n },\n\n detach: function(type, fn) {\n if (element.removeEventListener) {\n element.removeEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.detachEvent(\"on\" + type, fn);\n }\n return this;\n },\n\n contains: function(descendant) {\n // The [W3C spec](http://www.w3.org/TR/domcore/#dom-node-contains)\n // says a `null` (or ostensibly `undefined`) parameter\n // passed into `Node.contains` should result in a false return value.\n // IE7 throws an exception if the parameter is `undefined` though.\n if (!descendant) {\n return false;\n }\n\n // compareposition returns false in this case\n if (element === descendant) {\n return true;\n }\n\n if (element.contains) {\n return element.contains(descendant);\n } else {\n /*jslint bitwise: true*/\n return !!(descendant.compareDocumentPosition(element) & 8);\n }\n },\n\n /**\n * Insert this element before elementB.\n */\n insertBefore: function(elementB) {\n elementB.parentNode.insertBefore(element, elementB);\n return this;\n },\n\n remove: function() {\n element.parentNode.removeChild(element);\n return this;\n },\n\n /**\n * Sets styles for an element.\n * Fixes opacity in IE6-8.\n */\n css: function(styles) {\n /*jshint eqnull: true*/\n if (element.style == null) {\n throw new qq.Error(\"Can't apply style to node as it is not on the HTMLElement prototype chain!\");\n }\n\n /*jshint -W116*/\n if (styles.opacity != null) {\n if (typeof element.style.opacity !== \"string\" && typeof (element.filters) !== \"undefined\") {\n styles.filter = \"alpha(opacity=\" + Math.round(100 * styles.opacity) + \")\";\n }\n }\n qq.extend(element.style, styles);\n\n return this;\n },\n\n hasClass: function(name, considerParent) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className));\n },\n\n addClass: function(name) {\n if (!qq(element).hasClass(name)) {\n element.className += \" \" + name;\n }\n return this;\n },\n\n removeClass: function(name) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n element.className = element.className.replace(re, \" \").replace(/^\\s+|\\s+$/g, \"\");\n return this;\n },\n\n getByClass: function(className, first) {\n var candidates,\n result = [];\n\n if (first && element.querySelector) {\n return element.querySelector(\".\" + className);\n }\n else if (element.querySelectorAll) {\n return element.querySelectorAll(\".\" + className);\n }\n\n candidates = element.getElementsByTagName(\"*\");\n\n qq.each(candidates, function(idx, val) {\n if (qq(val).hasClass(className)) {\n result.push(val);\n }\n });\n return first ? result[0] : result;\n },\n\n getFirstByClass: function(className) {\n return qq(element).getByClass(className, true);\n },\n\n children: function() {\n var children = [],\n child = element.firstChild;\n\n while (child) {\n if (child.nodeType === 1) {\n children.push(child);\n }\n child = child.nextSibling;\n }\n\n return children;\n },\n\n setText: function(text) {\n element.innerText = text;\n element.textContent = text;\n return this;\n },\n\n clearText: function() {\n return qq(element).setText(\"\");\n },\n\n // Returns true if the attribute exists on the element\n // AND the value of the attribute is NOT \"false\" (case-insensitive)\n hasAttribute: function(attrName) {\n var attrVal;\n\n if (element.hasAttribute) {\n\n if (!element.hasAttribute(attrName)) {\n return false;\n }\n\n /*jshint -W116*/\n return (/^false$/i).exec(element.getAttribute(attrName)) == null;\n }\n else {\n attrVal = element[attrName];\n\n if (attrVal === undefined) {\n return false;\n }\n\n /*jshint -W116*/\n return (/^false$/i).exec(attrVal) == null;\n }\n }\n };\n};\n\n(function() {\n \"use strict\";\n\n qq.canvasToBlob = function(canvas, mime, quality) {\n return qq.dataUriToBlob(canvas.toDataURL(mime, quality));\n };\n\n qq.dataUriToBlob = function(dataUri) {\n var arrayBuffer, byteString,\n createBlob = function(data, mime) {\n var BlobBuilder = window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder,\n blobBuilder = BlobBuilder && new BlobBuilder();\n\n if (blobBuilder) {\n blobBuilder.append(data);\n return blobBuilder.getBlob(mime);\n }\n else {\n return new Blob([data], {type: mime});\n }\n },\n intArray, mimeString;\n\n // convert base64 to raw binary data held in a string\n if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n byteString = atob(dataUri.split(\",\")[1]);\n }\n else {\n byteString = decodeURI(dataUri.split(\",\")[1]);\n }\n\n // extract the MIME\n mimeString = dataUri.split(\",\")[0]\n .split(\":\")[1]\n .split(\";\")[0];\n\n // write the bytes of the binary string to an ArrayBuffer\n arrayBuffer = new ArrayBuffer(byteString.length);\n intArray = new Uint8Array(arrayBuffer);\n qq.each(byteString, function(idx, character) {\n intArray[idx] = character.charCodeAt(0);\n });\n\n return createBlob(arrayBuffer, mimeString);\n };\n\n qq.log = function(message, level) {\n if (window.console) {\n if (!level || level === \"info\") {\n window.console.log(message);\n }\n else\n {\n if (window.console[level]) {\n window.console[level](message);\n }\n else {\n window.console.log(\"<\" + level + \"> \" + message);\n }\n }\n }\n };\n\n qq.isObject = function(variable) {\n return variable && !variable.nodeType && Object.prototype.toString.call(variable) === \"[object Object]\";\n };\n\n qq.isFunction = function(variable) {\n return typeof (variable) === \"function\";\n };\n\n /**\n * Check the type of a value. Is it an \"array\"?\n *\n * @param value value to test.\n * @returns true if the value is an array or associated with an `ArrayBuffer`\n */\n qq.isArray = function(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\" ||\n (value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer);\n };\n\n // Looks for an object on a `DataTransfer` object that is associated with drop events when utilizing the Filesystem API.\n qq.isItemList = function(maybeItemList) {\n return Object.prototype.toString.call(maybeItemList) === \"[object DataTransferItemList]\";\n };\n\n // Looks for an object on a `NodeList` or an `HTMLCollection`|`HTMLFormElement`|`HTMLSelectElement`\n // object that is associated with collections of Nodes.\n qq.isNodeList = function(maybeNodeList) {\n return Object.prototype.toString.call(maybeNodeList) === \"[object NodeList]\" ||\n // If `HTMLCollection` is the actual type of the object, we must determine this\n // by checking for expected properties/methods on the object\n (maybeNodeList.item && maybeNodeList.namedItem);\n };\n\n qq.isString = function(maybeString) {\n return Object.prototype.toString.call(maybeString) === \"[object String]\";\n };\n\n qq.trimStr = function(string) {\n if (String.prototype.trim) {\n return string.trim();\n }\n\n return string.replace(/^\\s+|\\s+$/g, \"\");\n };\n\n /**\n * @param str String to format.\n * @returns {string} A string, swapping argument values with the associated occurrence of {} in the passed string.\n */\n qq.format = function(str) {\n\n var args = Array.prototype.slice.call(arguments, 1),\n newStr = str,\n nextIdxToReplace = newStr.indexOf(\"{}\");\n\n qq.each(args, function(idx, val) {\n var strBefore = newStr.substring(0, nextIdxToReplace),\n strAfter = newStr.substring(nextIdxToReplace + 2);\n\n newStr = strBefore + val + strAfter;\n nextIdxToReplace = newStr.indexOf(\"{}\", nextIdxToReplace + val.length);\n\n // End the loop if we have run out of tokens (when the arguments exceed the # of tokens)\n if (nextIdxToReplace < 0) {\n return false;\n }\n });\n\n return newStr;\n };\n\n qq.isFile = function(maybeFile) {\n return window.File && Object.prototype.toString.call(maybeFile) === \"[object File]\";\n };\n\n qq.isFileList = function(maybeFileList) {\n return window.FileList && Object.prototype.toString.call(maybeFileList) === \"[object FileList]\";\n };\n\n qq.isFileOrInput = function(maybeFileOrInput) {\n return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput);\n };\n\n qq.isInput = function(maybeInput, notFile) {\n var evaluateType = function(type) {\n var normalizedType = type.toLowerCase();\n\n if (notFile) {\n return normalizedType !== \"file\";\n }\n\n return normalizedType === \"file\";\n };\n\n if (window.HTMLInputElement) {\n if (Object.prototype.toString.call(maybeInput) === \"[object HTMLInputElement]\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n if (maybeInput.tagName) {\n if (maybeInput.tagName.toLowerCase() === \"input\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n qq.isBlob = function(maybeBlob) {\n if (window.Blob && Object.prototype.toString.call(maybeBlob) === \"[object Blob]\") {\n return true;\n }\n };\n\n qq.isXhrUploadSupported = function() {\n var input = document.createElement(\"input\");\n input.type = \"file\";\n\n return (\n input.multiple !== undefined &&\n typeof File !== \"undefined\" &&\n typeof FormData !== \"undefined\" &&\n typeof (qq.createXhrInstance()).upload !== \"undefined\");\n };\n\n // Fall back to ActiveX is native XHR is disabled (possible in any version of IE).\n qq.createXhrInstance = function() {\n if (window.XMLHttpRequest) {\n return new XMLHttpRequest();\n }\n\n try {\n return new ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n }\n catch (error) {\n qq.log(\"Neither XHR or ActiveX are supported!\", \"error\");\n return null;\n }\n };\n\n qq.isFolderDropSupported = function(dataTransfer) {\n return dataTransfer.items &&\n dataTransfer.items.length > 0 &&\n dataTransfer.items[0].webkitGetAsEntry;\n };\n\n qq.isFileChunkingSupported = function() {\n return !qq.androidStock() && //Android's stock browser cannot upload Blobs correctly\n qq.isXhrUploadSupported() &&\n (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined);\n };\n\n qq.sliceBlob = function(fileOrBlob, start, end) {\n var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice;\n\n return slicer.call(fileOrBlob, start, end);\n };\n\n qq.arrayBufferToHex = function(buffer) {\n var bytesAsHex = \"\",\n bytes = new Uint8Array(buffer);\n\n qq.each(bytes, function(idx, byt) {\n var byteAsHexStr = byt.toString(16);\n\n if (byteAsHexStr.length < 2) {\n byteAsHexStr = \"0\" + byteAsHexStr;\n }\n\n bytesAsHex += byteAsHexStr;\n });\n\n return bytesAsHex;\n };\n\n qq.readBlobToHex = function(blob, startOffset, length) {\n var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length),\n fileReader = new FileReader(),\n promise = new qq.Promise();\n\n fileReader.onload = function() {\n promise.success(qq.arrayBufferToHex(fileReader.result));\n };\n\n fileReader.onerror = promise.failure;\n\n fileReader.readAsArrayBuffer(initialBlob);\n\n return promise;\n };\n\n qq.extend = function(first, second, extendNested) {\n qq.each(second, function(prop, val) {\n if (extendNested && qq.isObject(val)) {\n if (first[prop] === undefined) {\n first[prop] = {};\n }\n qq.extend(first[prop], val, true);\n }\n else {\n first[prop] = val;\n }\n });\n\n return first;\n };\n\n /**\n * Allow properties in one object to override properties in another,\n * keeping track of the original values from the target object.\n *\n * Note that the pre-overriden properties to be overriden by the source will be passed into the `sourceFn` when it is invoked.\n *\n * @param target Update properties in this object from some source\n * @param sourceFn A function that, when invoked, will return properties that will replace properties with the same name in the target.\n * @returns {object} The target object\n */\n qq.override = function(target, sourceFn) {\n var super_ = {},\n source = sourceFn(super_);\n\n qq.each(source, function(srcPropName, srcPropVal) {\n if (target[srcPropName] !== undefined) {\n super_[srcPropName] = target[srcPropName];\n }\n\n target[srcPropName] = srcPropVal;\n });\n\n return target;\n };\n\n /**\n * Searches for a given element (elt) in the array, returns -1 if it is not present.\n */\n qq.indexOf = function(arr, elt, from) {\n if (arr.indexOf) {\n return arr.indexOf(elt, from);\n }\n\n from = from || 0;\n var len = arr.length;\n\n if (from < 0) {\n from += len;\n }\n\n for (; from < len; from += 1) {\n if (arr.hasOwnProperty(from) && arr[from] === elt) {\n return from;\n }\n }\n return -1;\n };\n\n //this is a version 4 UUID\n qq.getUniqueId = function() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n /*jslint eqeq: true, bitwise: true*/\n var r = Math.random() * 16 | 0, v = c == \"x\" ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n //\n // Browsers and platforms detection\n qq.ie = function() {\n return navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n navigator.userAgent.indexOf(\"Trident\") !== -1;\n };\n\n qq.ie7 = function() {\n return navigator.userAgent.indexOf(\"MSIE 7\") !== -1;\n };\n\n qq.ie8 = function() {\n return navigator.userAgent.indexOf(\"MSIE 8\") !== -1;\n };\n\n qq.ie10 = function() {\n return navigator.userAgent.indexOf(\"MSIE 10\") !== -1;\n };\n\n qq.ie11 = function() {\n return qq.ie() && navigator.userAgent.indexOf(\"rv:11\") !== -1;\n };\n\n qq.edge = function() {\n return navigator.userAgent.indexOf(\"Edge\") >= 0;\n };\n\n qq.safari = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Apple\") !== -1;\n };\n\n qq.chrome = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Google\") !== -1;\n };\n\n qq.opera = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Opera\") !== -1;\n };\n\n qq.firefox = function() {\n return (!qq.edge() && !qq.ie11() && navigator.userAgent.indexOf(\"Mozilla\") !== -1 && navigator.vendor !== undefined && navigator.vendor === \"\");\n };\n\n qq.windows = function() {\n return navigator.platform === \"Win32\";\n };\n\n qq.android = function() {\n return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n };\n\n // We need to identify the Android stock browser via the UA string to work around various bugs in this browser,\n // such as the one that prevents a `Blob` from being uploaded.\n qq.androidStock = function() {\n return qq.android() && navigator.userAgent.toLowerCase().indexOf(\"chrome\") < 0;\n };\n\n qq.ios6 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 6_\") !== -1;\n };\n\n qq.ios7 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 7_\") !== -1;\n };\n\n qq.ios8 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_\") !== -1;\n };\n\n // iOS 8.0.0\n qq.ios800 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_0 \") !== -1;\n };\n\n qq.ios = function() {\n /*jshint -W014 */\n return navigator.userAgent.indexOf(\"iPad\") !== -1\n || navigator.userAgent.indexOf(\"iPod\") !== -1\n || navigator.userAgent.indexOf(\"iPhone\") !== -1;\n };\n\n qq.iosChrome = function() {\n return qq.ios() && navigator.userAgent.indexOf(\"CriOS\") !== -1;\n };\n\n qq.iosSafari = function() {\n return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf(\"Safari\") !== -1;\n };\n\n qq.iosSafariWebView = function() {\n return qq.ios() && !qq.iosChrome() && !qq.iosSafari();\n };\n\n //\n // Events\n\n qq.preventDefault = function(e) {\n if (e.preventDefault) {\n e.preventDefault();\n } else {\n e.returnValue = false;\n }\n };\n\n /**\n * Creates and returns element from html string\n * Uses innerHTML to create an element\n */\n qq.toElement = (function() {\n var div = document.createElement(\"div\");\n return function(html) {\n div.innerHTML = html;\n var element = div.firstChild;\n div.removeChild(element);\n return element;\n };\n }());\n\n //key and value are passed to callback for each entry in the iterable item\n qq.each = function(iterableItem, callback) {\n var keyOrIndex, retVal;\n\n if (iterableItem) {\n // Iterate through [`Storage`](http://www.w3.org/TR/webstorage/#the-storage-interface) items\n if (window.Storage && iterableItem.constructor === window.Storage) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex)));\n if (retVal === false) {\n break;\n }\n }\n }\n // `DataTransferItemList` & `NodeList` objects are array-like and should be treated as arrays\n // when iterating over items inside the object.\n else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n }\n else if (qq.isString(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex));\n if (retVal === false) {\n break;\n }\n }\n }\n else {\n for (keyOrIndex in iterableItem) {\n if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n }\n }\n }\n };\n\n //include any args that should be passed to the new function after the context arg\n qq.bind = function(oldFunc, context) {\n if (qq.isFunction(oldFunc)) {\n var args = Array.prototype.slice.call(arguments, 2);\n\n return function() {\n var newArgs = qq.extend([], args);\n if (arguments.length) {\n newArgs = newArgs.concat(Array.prototype.slice.call(arguments));\n }\n return oldFunc.apply(context, newArgs);\n };\n }\n\n throw new Error(\"first parameter must be a function!\");\n };\n\n /**\n * obj2url() takes a json-object as argument and generates\n * a querystring. pretty much like jQuery.param()\n *\n * how to use:\n *\n * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`\n *\n * will result in:\n *\n * `http://any.url/upload?otherParam=value&a=b&c=d`\n *\n * @param Object JSON-Object\n * @param String current querystring-part\n * @return String encoded querystring\n */\n qq.obj2url = function(obj, temp, prefixDone) {\n /*jshint laxbreak: true*/\n var uristrings = [],\n prefix = \"&\",\n add = function(nextObj, i) {\n var nextTemp = temp\n ? (/\\[\\]$/.test(temp)) // prevent double-encoding\n ? temp\n : temp + \"[\" + i + \"]\"\n : i;\n if ((nextTemp !== \"undefined\") && (i !== \"undefined\")) {\n uristrings.push(\n (typeof nextObj === \"object\")\n ? qq.obj2url(nextObj, nextTemp, true)\n : (Object.prototype.toString.call(nextObj) === \"[object Function]\")\n ? encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj())\n : encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj)\n );\n }\n };\n\n if (!prefixDone && temp) {\n prefix = (/\\?/.test(temp)) ? (/\\?$/.test(temp)) ? \"\" : \"&\" : \"?\";\n uristrings.push(temp);\n uristrings.push(qq.obj2url(obj));\n } else if ((Object.prototype.toString.call(obj) === \"[object Array]\") && (typeof obj !== \"undefined\")) {\n qq.each(obj, function(idx, val) {\n add(val, idx);\n });\n } else if ((typeof obj !== \"undefined\") && (obj !== null) && (typeof obj === \"object\")) {\n qq.each(obj, function(prop, val) {\n add(val, prop);\n });\n } else {\n uristrings.push(encodeURIComponent(temp) + \"=\" + encodeURIComponent(obj));\n }\n\n if (temp) {\n return uristrings.join(prefix);\n } else {\n return uristrings.join(prefix)\n .replace(/^&/, \"\")\n .replace(/%20/g, \"+\");\n }\n };\n\n qq.obj2FormData = function(obj, formData, arrayKeyName) {\n if (!formData) {\n formData = new FormData();\n }\n\n qq.each(obj, function(key, val) {\n key = arrayKeyName ? arrayKeyName + \"[\" + key + \"]\" : key;\n\n if (qq.isObject(val)) {\n qq.obj2FormData(val, formData, key);\n }\n else if (qq.isFunction(val)) {\n formData.append(key, val());\n }\n else {\n formData.append(key, val);\n }\n });\n\n return formData;\n };\n\n qq.obj2Inputs = function(obj, form) {\n var input;\n\n if (!form) {\n form = document.createElement(\"form\");\n }\n\n qq.obj2FormData(obj, {\n append: function(key, val) {\n input = document.createElement(\"input\");\n input.setAttribute(\"name\", key);\n input.setAttribute(\"value\", val);\n form.appendChild(input);\n }\n });\n\n return form;\n };\n\n /**\n * Not recommended for use outside of Fine Uploader since this falls back to an unchecked eval if JSON.parse is not\n * implemented. For a more secure JSON.parse polyfill, use Douglas Crockford's json2.js.\n */\n qq.parseJson = function(json) {\n /*jshint evil: true*/\n if (window.JSON && qq.isFunction(JSON.parse)) {\n return JSON.parse(json);\n } else {\n return eval(\"(\" + json + \")\");\n }\n };\n\n /**\n * Retrieve the extension of a file, if it exists.\n *\n * @param filename\n * @returns {string || undefined}\n */\n qq.getExtension = function(filename) {\n var extIdx = filename.lastIndexOf(\".\") + 1;\n\n if (extIdx > 0) {\n return filename.substr(extIdx, filename.length - extIdx);\n }\n };\n\n qq.getFilename = function(blobOrFileInput) {\n /*jslint regexp: true*/\n\n if (qq.isInput(blobOrFileInput)) {\n // get input value and remove path to normalize\n return blobOrFileInput.value.replace(/.*(\\/|\\\\)/, \"\");\n }\n else if (qq.isFile(blobOrFileInput)) {\n if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) {\n return blobOrFileInput.fileName;\n }\n }\n\n return blobOrFileInput.name;\n };\n\n /**\n * A generic module which supports object disposing in dispose() method.\n * */\n qq.DisposeSupport = function() {\n var disposers = [];\n\n return {\n /** Run all registered disposers */\n dispose: function() {\n var disposer;\n do {\n disposer = disposers.shift();\n if (disposer) {\n disposer();\n }\n }\n while (disposer);\n },\n\n /** Attach event handler and register de-attacher as a disposer */\n attach: function() {\n var args = arguments;\n /*jslint undef:true*/\n this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1)));\n },\n\n /** Add disposer to the collection */\n addDisposer: function(disposeFunction) {\n disposers.push(disposeFunction);\n }\n };\n };\n}());\n","/* globals define, module, global, qq */\n(function() {\n \"use strict\";\n if (typeof define === \"function\" && define.amd) {\n define(function() {\n return qq;\n });\n }\n else if (typeof module !== \"undefined\" && module.exports) {\n module.exports = qq;\n }\n else {\n global.qq = qq;\n }\n}());\n","/*global qq */\nqq.version = \"5.16.2\";\n","/* globals qq */\nqq.supportedFeatures = (function() {\n \"use strict\";\n\n var supportsUploading,\n supportsUploadingBlobs,\n supportsFileDrop,\n supportsAjaxFileUploading,\n supportsFolderDrop,\n supportsChunking,\n supportsResume,\n supportsUploadViaPaste,\n supportsUploadCors,\n supportsDeleteFileXdr,\n supportsDeleteFileCorsXhr,\n supportsDeleteFileCors,\n supportsFolderSelection,\n supportsImagePreviews,\n supportsUploadProgress;\n\n function testSupportsFileInputElement() {\n var supported = true,\n tempInput;\n\n try {\n tempInput = document.createElement(\"input\");\n tempInput.type = \"file\";\n qq(tempInput).hide();\n\n if (tempInput.disabled) {\n supported = false;\n }\n }\n catch (ex) {\n supported = false;\n }\n\n return supported;\n }\n\n //only way to test for complete Clipboard API support at this time\n function isChrome14OrHigher() {\n return (qq.chrome() || qq.opera()) &&\n navigator.userAgent.match(/Chrome\\/[1][4-9]|Chrome\\/[2-9][0-9]/) !== undefined;\n }\n\n //Ensure we can send cross-origin `XMLHttpRequest`s\n function isCrossOriginXhrSupported() {\n if (window.XMLHttpRequest) {\n var xhr = qq.createXhrInstance();\n\n //Commonly accepted test for XHR CORS support.\n return xhr.withCredentials !== undefined;\n }\n\n return false;\n }\n\n //Test for (terrible) cross-origin ajax transport fallback for IE9 and IE8\n function isXdrSupported() {\n return window.XDomainRequest !== undefined;\n }\n\n // CORS Ajax requests are supported if it is either possible to send credentialed `XMLHttpRequest`s,\n // or if `XDomainRequest` is an available alternative.\n function isCrossOriginAjaxSupported() {\n if (isCrossOriginXhrSupported()) {\n return true;\n }\n\n return isXdrSupported();\n }\n\n function isFolderSelectionSupported() {\n // We know that folder selection is only supported in Chrome via this proprietary attribute for now\n return document.createElement(\"input\").webkitdirectory !== undefined;\n }\n\n function isLocalStorageSupported() {\n try {\n return !!window.localStorage &&\n // unpatched versions of IE10/11 have buggy impls of localStorage where setItem is a string\n qq.isFunction(window.localStorage.setItem);\n }\n catch (error) {\n // probably caught a security exception, so no localStorage for you\n return false;\n }\n }\n\n function isDragAndDropSupported() {\n var span = document.createElement(\"span\");\n\n return (\"draggable\" in span || (\"ondragstart\" in span && \"ondrop\" in span)) &&\n !qq.android() && !qq.ios();\n }\n\n supportsUploading = testSupportsFileInputElement();\n\n supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported();\n\n supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock();\n\n supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported();\n\n // adapted from https://stackoverflow.com/a/23278460/486979\n supportsFolderDrop = supportsFileDrop && (function() {\n var input = document.createElement(\"input\");\n\n input.type = \"file\";\n return !!(\"webkitdirectory\" in (input || document.querySelectorAll(\"input[type=file]\")[0]));\n }());\n\n supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported();\n\n supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported();\n\n supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher();\n\n supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading);\n\n supportsDeleteFileCorsXhr = isCrossOriginXhrSupported();\n\n supportsDeleteFileXdr = isXdrSupported();\n\n supportsDeleteFileCors = isCrossOriginAjaxSupported();\n\n supportsFolderSelection = isFolderSelectionSupported();\n\n supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined;\n\n supportsUploadProgress = (function() {\n if (supportsAjaxFileUploading) {\n return !qq.androidStock() && !qq.iosChrome();\n }\n return false;\n }());\n\n return {\n ajaxUploading: supportsAjaxFileUploading,\n blobUploading: supportsUploadingBlobs,\n canDetermineSize: supportsAjaxFileUploading,\n chunking: supportsChunking,\n deleteFileCors: supportsDeleteFileCors,\n deleteFileCorsXdr: supportsDeleteFileXdr, //NOTE: will also return true in IE10, where XDR is also supported\n deleteFileCorsXhr: supportsDeleteFileCorsXhr,\n dialogElement: !!window.HTMLDialogElement,\n fileDrop: supportsFileDrop,\n folderDrop: supportsFolderDrop,\n folderSelection: supportsFolderSelection,\n imagePreviews: supportsImagePreviews,\n imageValidation: supportsImagePreviews,\n itemSizeValidation: supportsAjaxFileUploading,\n pause: supportsChunking,\n progressBar: supportsUploadProgress,\n resume: supportsResume,\n scaling: supportsImagePreviews && supportsUploadingBlobs,\n tiffPreviews: qq.safari(), // Not the best solution, but simple and probably accurate enough (for now)\n unlimitedScaledImageSize: !qq.ios(), // false simply indicates that there is some known limit\n uploading: supportsUploading,\n uploadCors: supportsUploadCors,\n uploadCustomHeaders: supportsAjaxFileUploading,\n uploadNonMultipart: supportsAjaxFileUploading,\n uploadViaPaste: supportsUploadViaPaste\n };\n\n}());\n","/*globals qq*/\n\n// Is the passed object a promise instance?\nqq.isGenericPromise = function(maybePromise) {\n \"use strict\";\n return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then));\n};\n\nqq.Promise = function() {\n \"use strict\";\n\n var successArgs, failureArgs,\n successCallbacks = [],\n failureCallbacks = [],\n doneCallbacks = [],\n state = 0;\n\n qq.extend(this, {\n then: function(onSuccess, onFailure) {\n if (state === 0) {\n if (onSuccess) {\n successCallbacks.push(onSuccess);\n }\n if (onFailure) {\n failureCallbacks.push(onFailure);\n }\n }\n else if (state === -1) {\n onFailure && onFailure.apply(null, failureArgs);\n }\n else if (onSuccess) {\n onSuccess.apply(null, successArgs);\n }\n\n return this;\n },\n\n done: function(callback) {\n if (state === 0) {\n doneCallbacks.push(callback);\n }\n else {\n callback.apply(null, failureArgs === undefined ? successArgs : failureArgs);\n }\n\n return this;\n },\n\n success: function() {\n state = 1;\n successArgs = arguments;\n\n if (successCallbacks.length) {\n qq.each(successCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n\n return this;\n },\n\n failure: function() {\n state = -1;\n failureArgs = arguments;\n\n if (failureCallbacks.length) {\n qq.each(failureCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n\n return this;\n }\n });\n};\n","/*globals qq, document, CustomEvent*/\nqq.DragAndDrop = function(o) {\n \"use strict\";\n\n var options,\n HIDE_ZONES_EVENT_NAME = \"qq-hidezones\",\n HIDE_BEFORE_ENTER_ATTR = \"qq-hide-dropzone\",\n uploadDropZones = [],\n droppedFiles = [],\n disposeSupport = new qq.DisposeSupport();\n\n options = {\n dropZoneElements: [],\n allowMultipleItems: true,\n classes: {\n dropActive: null\n },\n callbacks: new qq.DragAndDrop.callbacks()\n };\n\n qq.extend(options, o, true);\n\n function uploadDroppedFiles(files, uploadDropZone) {\n // We need to convert the `FileList` to an actual `Array` to avoid iteration issues\n var filesAsArray = Array.prototype.slice.call(files);\n\n options.callbacks.dropLog(\"Grabbed \" + files.length + \" dropped files.\");\n uploadDropZone.dropDisabled(false);\n options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement());\n }\n\n function traverseFileTree(entry) {\n var parseEntryPromise = new qq.Promise();\n\n if (entry.isFile) {\n entry.file(function(file) {\n file.qqPath = extractDirectoryPath(entry);\n droppedFiles.push(file);\n parseEntryPromise.success();\n },\n function(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n });\n }\n else if (entry.isDirectory) {\n getFilesInDirectory(entry).then(\n function allEntriesRead(entries) {\n var entriesLeft = entries.length;\n\n qq.each(entries, function(idx, entry) {\n traverseFileTree(entry).done(function() {\n entriesLeft -= 1;\n\n if (entriesLeft === 0) {\n parseEntryPromise.success();\n }\n });\n });\n\n if (!entries.length) {\n parseEntryPromise.success();\n }\n },\n\n function readFailure(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n }\n );\n }\n\n return parseEntryPromise;\n }\n\n function extractDirectoryPath(entry) {\n var name = entry.name,\n fullPath = entry.fullPath,\n indexOfNameInFullPath = fullPath.lastIndexOf(name);\n\n // remove file name from full path string\n fullPath = fullPath.substr(0, indexOfNameInFullPath);\n\n // remove leading slash in full path string\n if (fullPath.charAt(0) === \"/\") {\n fullPath = fullPath.substr(1);\n }\n\n return fullPath;\n }\n\n // Promissory. Guaranteed to read all files in the root of the passed directory.\n function getFilesInDirectory(entry, reader, accumEntries, existingPromise) {\n var promise = existingPromise || new qq.Promise(),\n dirReader = reader || entry.createReader();\n\n dirReader.readEntries(\n function readSuccess(entries) {\n var newEntries = accumEntries ? accumEntries.concat(entries) : entries;\n\n if (entries.length) {\n setTimeout(function() { // prevent stack overflow, however unlikely\n getFilesInDirectory(entry, dirReader, newEntries, promise);\n }, 0);\n }\n else {\n promise.success(newEntries);\n }\n },\n\n promise.failure\n );\n\n return promise;\n }\n\n function handleDataTransfer(dataTransfer, uploadDropZone) {\n var pendingFolderPromises = [],\n handleDataTransferPromise = new qq.Promise();\n\n options.callbacks.processingDroppedFiles();\n uploadDropZone.dropDisabled(true);\n\n if (dataTransfer.files.length > 1 && !options.allowMultipleItems) {\n options.callbacks.processingDroppedFilesComplete([]);\n options.callbacks.dropError(\"tooManyFilesError\", \"\");\n uploadDropZone.dropDisabled(false);\n handleDataTransferPromise.failure();\n }\n else {\n droppedFiles = [];\n\n if (qq.isFolderDropSupported(dataTransfer)) {\n qq.each(dataTransfer.items, function(idx, item) {\n var entry = item.webkitGetAsEntry();\n\n if (entry) {\n //due to a bug in Chrome's File System API impl - #149735\n if (entry.isFile) {\n droppedFiles.push(item.getAsFile());\n }\n\n else {\n pendingFolderPromises.push(traverseFileTree(entry).done(function() {\n pendingFolderPromises.pop();\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }));\n }\n }\n });\n }\n else {\n droppedFiles = dataTransfer.files;\n }\n\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }\n\n return handleDataTransferPromise;\n }\n\n function setupDropzone(dropArea) {\n var dropZone = new qq.UploadDropZone({\n HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME,\n element: dropArea,\n onEnter: function(e) {\n qq(dropArea).addClass(options.classes.dropActive);\n e.stopPropagation();\n },\n onLeaveNotDescendants: function(e) {\n qq(dropArea).removeClass(options.classes.dropActive);\n },\n onDrop: function(e) {\n handleDataTransfer(e.dataTransfer, dropZone).then(\n function() {\n uploadDroppedFiles(droppedFiles, dropZone);\n },\n function() {\n options.callbacks.dropLog(\"Drop event DataTransfer parsing failed. No files will be uploaded.\", \"error\");\n }\n );\n }\n });\n\n disposeSupport.addDisposer(function() {\n dropZone.dispose();\n });\n\n qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide();\n\n uploadDropZones.push(dropZone);\n\n return dropZone;\n }\n\n function isFileDrag(dragEvent) {\n var fileDrag;\n\n qq.each(dragEvent.dataTransfer.types, function(key, val) {\n if (val === \"Files\") {\n fileDrag = true;\n return false;\n }\n });\n\n return fileDrag;\n }\n\n // Attempt to determine when the file has left the document. It is not always possible to detect this\n // in all cases, but it is generally possible in all browsers, with a few exceptions.\n //\n // Exceptions:\n // * IE10+ & Safari: We can't detect a file leaving the document if the Explorer window housing the file\n // overlays the browser window.\n // * IE10+: If the file is dragged out of the window too quickly, IE does not set the expected values of the\n // event's X & Y properties.\n function leavingDocumentOut(e) {\n if (qq.safari()) {\n return e.x < 0 || e.y < 0;\n }\n\n return e.x === 0 && e.y === 0;\n }\n\n function setupDragDrop() {\n var dropZones = options.dropZoneElements,\n\n maybeHideDropZones = function() {\n setTimeout(function() {\n qq.each(dropZones, function(idx, dropZone) {\n qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();\n qq(dropZone).removeClass(options.classes.dropActive);\n });\n }, 10);\n };\n\n qq.each(dropZones, function(idx, dropZone) {\n var uploadDropZone = setupDropzone(dropZone);\n\n // IE <= 9 does not support the File API used for drag+drop uploads\n if (dropZones.length && qq.supportedFeatures.fileDrop) {\n disposeSupport.attach(document, \"dragenter\", function(e) {\n if (!uploadDropZone.dropDisabled() && isFileDrag(e)) {\n qq.each(dropZones, function(idx, dropZone) {\n // We can't apply styles to non-HTMLElements, since they lack the `style` property.\n // Also, if the drop zone isn't initially hidden, let's not mess with `style.display`.\n if (dropZone instanceof HTMLElement &&\n qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR)) {\n\n qq(dropZone).css({display: \"block\"});\n }\n });\n }\n });\n }\n });\n\n disposeSupport.attach(document, \"dragleave\", function(e) {\n if (leavingDocumentOut(e)) {\n maybeHideDropZones();\n }\n });\n\n // Just in case we were not able to detect when a dragged file has left the document,\n // hide all relevant drop zones the next time the mouse enters the document.\n // Note that mouse events such as this one are not fired during drag operations.\n disposeSupport.attach(qq(document).children()[0], \"mouseenter\", function(e) {\n maybeHideDropZones();\n });\n\n disposeSupport.attach(document, \"drop\", function(e) {\n if (isFileDrag(e)) {\n e.preventDefault();\n maybeHideDropZones();\n }\n });\n\n disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, maybeHideDropZones);\n }\n\n setupDragDrop();\n\n qq.extend(this, {\n setupExtraDropzone: function(element) {\n options.dropZoneElements.push(element);\n setupDropzone(element);\n },\n\n removeDropzone: function(element) {\n var i,\n dzs = options.dropZoneElements;\n\n for (i in dzs) {\n if (dzs[i] === element) {\n return dzs.splice(i, 1);\n }\n }\n },\n\n dispose: function() {\n disposeSupport.dispose();\n qq.each(uploadDropZones, function(idx, dropZone) {\n dropZone.dispose();\n });\n }\n });\n\n this._testing = {};\n this._testing.extractDirectoryPath = extractDirectoryPath;\n};\n\nqq.DragAndDrop.callbacks = function() {\n \"use strict\";\n\n return {\n processingDroppedFiles: function() {},\n processingDroppedFilesComplete: function(files, targetEl) {},\n dropError: function(code, errorSpecifics) {\n qq.log(\"Drag & drop error code '\" + code + \" with these specifics: '\" + errorSpecifics + \"'\", \"error\");\n },\n dropLog: function(message, level) {\n qq.log(message, level);\n }\n };\n};\n\nqq.UploadDropZone = function(o) {\n \"use strict\";\n\n var disposeSupport = new qq.DisposeSupport(),\n options, element, preventDrop, dropOutsideDisabled;\n\n options = {\n element: null,\n onEnter: function(e) {},\n onLeave: function(e) {},\n // is not fired when leaving element by hovering descendants\n onLeaveNotDescendants: function(e) {},\n onDrop: function(e) {}\n };\n\n qq.extend(options, o);\n element = options.element;\n\n function dragoverShouldBeCanceled() {\n return qq.safari() || (qq.firefox() && qq.windows());\n }\n\n function disableDropOutside(e) {\n // run only once for all instances\n if (!dropOutsideDisabled) {\n\n // for these cases we need to catch onDrop to reset dropArea\n if (dragoverShouldBeCanceled) {\n disposeSupport.attach(document, \"dragover\", function(e) {\n e.preventDefault();\n });\n } else {\n disposeSupport.attach(document, \"dragover\", function(e) {\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"none\";\n e.preventDefault();\n }\n });\n }\n\n dropOutsideDisabled = true;\n }\n }\n\n function isValidFileDrag(e) {\n // e.dataTransfer currently causing IE errors\n // IE9 does NOT support file API, so drag-and-drop is not possible\n if (!qq.supportedFeatures.fileDrop) {\n return false;\n }\n\n var effectTest, dt = e.dataTransfer,\n // do not check dt.types.contains in webkit, because it crashes safari 4\n isSafari = qq.safari();\n\n // dt.effectAllowed is none in Safari 5\n\n // dt.effectAllowed crashes IE 11 & 10 when files have been dragged from\n // the filesystem\n effectTest = qq.ie() && qq.supportedFeatures.fileDrop ? true : dt.effectAllowed !== \"none\";\n return dt && effectTest &&\n (\n (dt.files && dt.files.length) || // Valid for drop events with files\n (!isSafari && dt.types.contains && dt.types.contains(\"Files\")) || // Valid in Chrome/Firefox\n (dt.types.includes && dt.types.includes(\"Files\")) // Valid in IE\n );\n }\n\n function isOrSetDropDisabled(isDisabled) {\n if (isDisabled !== undefined) {\n preventDrop = isDisabled;\n }\n return preventDrop;\n }\n\n function triggerHidezonesEvent() {\n var hideZonesEvent;\n\n function triggerUsingOldApi() {\n hideZonesEvent = document.createEvent(\"Event\");\n hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true);\n }\n\n if (window.CustomEvent) {\n try {\n hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME);\n }\n catch (err) {\n triggerUsingOldApi();\n }\n }\n else {\n triggerUsingOldApi();\n }\n\n document.dispatchEvent(hideZonesEvent);\n }\n\n function attachEvents() {\n disposeSupport.attach(element, \"dragover\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n // dt.effectAllowed crashes IE 11 & 10 when files have been dragged from\n // the filesystem\n var effect = qq.ie() && qq.supportedFeatures.fileDrop ? null : e.dataTransfer.effectAllowed;\n if (effect === \"move\" || effect === \"linkMove\") {\n e.dataTransfer.dropEffect = \"move\"; // for FF (only move allowed)\n } else {\n e.dataTransfer.dropEffect = \"copy\"; // for Chrome\n }\n\n e.stopPropagation();\n e.preventDefault();\n });\n\n disposeSupport.attach(element, \"dragenter\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n options.onEnter(e);\n }\n });\n\n disposeSupport.attach(element, \"dragleave\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n options.onLeave(e);\n\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n // do not fire when moving a mouse over a descendant\n if (qq(this).contains(relatedTarget)) {\n return;\n }\n\n options.onLeaveNotDescendants(e);\n });\n\n disposeSupport.attach(element, \"drop\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n options.onDrop(e);\n\n triggerHidezonesEvent();\n }\n });\n }\n\n disableDropOutside();\n attachEvents();\n\n qq.extend(this, {\n dropDisabled: function(isDisabled) {\n return isOrSetDropDisabled(isDisabled);\n },\n\n dispose: function() {\n disposeSupport.dispose();\n },\n\n getElement: function() {\n return element;\n }\n });\n\n this._testing = {};\n this._testing.isValidFileDrag = isValidFileDrag;\n};\n"]} \ No newline at end of file diff --git a/resources/fine-uploader/dnd.min.js b/resources/fine-uploader/dnd.min.js new file mode 100644 index 0000000..bad4e2d --- /dev/null +++ b/resources/fine-uploader/dnd.min.js @@ -0,0 +1,3 @@ +// Fine Uploader 5.16.2 - MIT licensed. http://fineuploader.com +!function(global){var qq=function(e){"use strict";return{hide:function(){return e.style.display="none",this},attach:function(t,n){return e.addEventListener?e.addEventListener(t,n,!1):e.attachEvent&&e.attachEvent("on"+t,n),function(){qq(e).detach(t,n)}},detach:function(t,n){return e.removeEventListener?e.removeEventListener(t,n,!1):e.attachEvent&&e.detachEvent("on"+t,n),this},contains:function(t){return!!t&&(e===t||(e.contains?e.contains(t):!!(8&t.compareDocumentPosition(e))))},insertBefore:function(t){return t.parentNode.insertBefore(e,t),this},remove:function(){return e.parentNode.removeChild(e),this},css:function(t){if(null==e.style)throw new qq.Error("Can't apply style to node as it is not on the HTMLElement prototype chain!");return null!=t.opacity&&"string"!=typeof e.style.opacity&&void 0!==e.filters&&(t.filter="alpha(opacity="+Math.round(100*t.opacity)+")"),qq.extend(e.style,t),this},hasClass:function(t,n){var r=new RegExp("(^| )"+t+"( |$)");return r.test(e.className)||!(!n||!r.test(e.parentNode.className))},addClass:function(t){return qq(e).hasClass(t)||(e.className+=" "+t),this},removeClass:function(t){var n=new RegExp("(^| )"+t+"( |$)");return e.className=e.className.replace(n," ").replace(/^\s+|\s+$/g,""),this},getByClass:function(t,n){var r,o=[];return n&&e.querySelector?e.querySelector("."+t):e.querySelectorAll?e.querySelectorAll("."+t):(r=e.getElementsByTagName("*"),qq.each(r,function(e,n){qq(n).hasClass(t)&&o.push(n)}),n?o[0]:o)},getFirstByClass:function(t){return qq(e).getByClass(t,!0)},children:function(){for(var t=[],n=e.firstChild;n;)1===n.nodeType&&t.push(n),n=n.nextSibling;return t},setText:function(t){return e.innerText=t,e.textContent=t,this},clearText:function(){return qq(e).setText("")},hasAttribute:function(t){var n;return e.hasAttribute?!!e.hasAttribute(t)&&null==/^false$/i.exec(e.getAttribute(t)):(n=e[t],void 0!==n&&null==/^false$/i.exec(n))}}};!function(){"use strict";qq.canvasToBlob=function(e,t,n){return qq.dataUriToBlob(e.toDataURL(t,n))},qq.dataUriToBlob=function(e){var t,n,r,o,i=function(e,t){var n=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,r=n&&new n;return r?(r.append(e),r.getBlob(t)):new Blob([e],{type:t})};return n=e.split(",")[0].indexOf("base64")>=0?atob(e.split(",")[1]):decodeURI(e.split(",")[1]),o=e.split(",")[0].split(":")[1].split(";")[0],t=new ArrayBuffer(n.length),r=new Uint8Array(t),qq.each(n,function(e,t){r[e]=t.charCodeAt(0)}),i(t,o)},qq.log=function(e,t){window.console&&(t&&"info"!==t?window.console[t]?window.console[t](e):window.console.log("<"+t+"> "+e):window.console.log(e))},qq.isObject=function(e){return e&&!e.nodeType&&"[object Object]"===Object.prototype.toString.call(e)},qq.isFunction=function(e){return"function"==typeof e},qq.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)||e&&window.ArrayBuffer&&e.buffer&&e.buffer.constructor===ArrayBuffer},qq.isItemList=function(e){return"[object DataTransferItemList]"===Object.prototype.toString.call(e)},qq.isNodeList=function(e){return"[object NodeList]"===Object.prototype.toString.call(e)||e.item&&e.namedItem},qq.isString=function(e){return"[object String]"===Object.prototype.toString.call(e)},qq.trimStr=function(e){return String.prototype.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},qq.format=function(e){var t=Array.prototype.slice.call(arguments,1),n=e,r=n.indexOf("{}");return qq.each(t,function(e,t){if(n=n.substring(0,r)+t+n.substring(r+2),r=n.indexOf("{}",r+t.length),r<0)return!1}),n},qq.isFile=function(e){return window.File&&"[object File]"===Object.prototype.toString.call(e)},qq.isFileList=function(e){return window.FileList&&"[object FileList]"===Object.prototype.toString.call(e)},qq.isFileOrInput=function(e){return qq.isFile(e)||qq.isInput(e)},qq.isInput=function(e,t){var n=function(e){var n=e.toLowerCase();return t?"file"!==n:"file"===n};return!!(window.HTMLInputElement&&"[object HTMLInputElement]"===Object.prototype.toString.call(e)&&e.type&&n(e.type))||!!(e.tagName&&"input"===e.tagName.toLowerCase()&&e.type&&n(e.type))},qq.isBlob=function(e){if(window.Blob&&"[object Blob]"===Object.prototype.toString.call(e))return!0},qq.isXhrUploadSupported=function(){var e=document.createElement("input");return e.type="file",void 0!==e.multiple&&"undefined"!=typeof File&&"undefined"!=typeof FormData&&void 0!==qq.createXhrInstance().upload},qq.createXhrInstance=function(){if(window.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(e){return qq.log("Neither XHR or ActiveX are supported!","error"),null}},qq.isFolderDropSupported=function(e){return e.items&&e.items.length>0&&e.items[0].webkitGetAsEntry},qq.isFileChunkingSupported=function(){return!qq.androidStock()&&qq.isXhrUploadSupported()&&(void 0!==File.prototype.slice||void 0!==File.prototype.webkitSlice||void 0!==File.prototype.mozSlice)},qq.sliceBlob=function(e,t,n){return(e.slice||e.mozSlice||e.webkitSlice).call(e,t,n)},qq.arrayBufferToHex=function(e){var t="",n=new Uint8Array(e);return qq.each(n,function(e,n){var r=n.toString(16);r.length<2&&(r="0"+r),t+=r}),t},qq.readBlobToHex=function(e,t,n){var r=qq.sliceBlob(e,t,t+n),o=new FileReader,i=new qq.Promise;return o.onload=function(){i.success(qq.arrayBufferToHex(o.result))},o.onerror=i.failure,o.readAsArrayBuffer(r),i},qq.extend=function(e,t,n){return qq.each(t,function(t,r){n&&qq.isObject(r)?(void 0===e[t]&&(e[t]={}),qq.extend(e[t],r,!0)):e[t]=r}),e},qq.override=function(e,t){var n={},r=t(n);return qq.each(r,function(t,r){void 0!==e[t]&&(n[t]=e[t]),e[t]=r}),e},qq.indexOf=function(e,t,n){if(e.indexOf)return e.indexOf(t,n);n=n||0;var r=e.length;for(n<0&&(n+=r);n=0},qq.safari=function(){return void 0!==navigator.vendor&&navigator.vendor.indexOf("Apple")!==-1},qq.chrome=function(){return void 0!==navigator.vendor&&navigator.vendor.indexOf("Google")!==-1},qq.opera=function(){return void 0!==navigator.vendor&&navigator.vendor.indexOf("Opera")!==-1},qq.firefox=function(){return!qq.edge()&&!qq.ie11()&&navigator.userAgent.indexOf("Mozilla")!==-1&&void 0!==navigator.vendor&&""===navigator.vendor},qq.windows=function(){return"Win32"===navigator.platform},qq.android=function(){return navigator.userAgent.toLowerCase().indexOf("android")!==-1},qq.androidStock=function(){return qq.android()&&navigator.userAgent.toLowerCase().indexOf("chrome")<0},qq.ios6=function(){return qq.ios()&&navigator.userAgent.indexOf(" OS 6_")!==-1},qq.ios7=function(){return qq.ios()&&navigator.userAgent.indexOf(" OS 7_")!==-1},qq.ios8=function(){return qq.ios()&&navigator.userAgent.indexOf(" OS 8_")!==-1},qq.ios800=function(){return qq.ios()&&navigator.userAgent.indexOf(" OS 8_0 ")!==-1},qq.ios=function(){return navigator.userAgent.indexOf("iPad")!==-1||navigator.userAgent.indexOf("iPod")!==-1||navigator.userAgent.indexOf("iPhone")!==-1},qq.iosChrome=function(){return qq.ios()&&navigator.userAgent.indexOf("CriOS")!==-1},qq.iosSafari=function(){return qq.ios()&&!qq.iosChrome()&&navigator.userAgent.indexOf("Safari")!==-1},qq.iosSafariWebView=function(){return qq.ios()&&!qq.iosChrome()&&!qq.iosSafari()},qq.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},qq.toElement=function(){var e=document.createElement("div");return function(t){e.innerHTML=t;var n=e.firstChild;return e.removeChild(n),n}}(),qq.each=function(e,t){var n,r;if(e)if(window.Storage&&e.constructor===window.Storage)for(n=0;n0)return e.substr(t,e.length-t)},qq.getFilename=function(e){return qq.isInput(e)?e.value.replace(/.*(\/|\\)/,""):qq.isFile(e)&&null!==e.fileName&&void 0!==e.fileName?e.fileName:e.name},qq.DisposeSupport=function(){var e=[];return{dispose:function(){var t;do t=e.shift(),t&&t();while(t)},attach:function(){var e=arguments;this.addDisposer(qq(e[0]).attach.apply(this,Array.prototype.slice.call(arguments,1)))},addDisposer:function(t){e.push(t)}}}}(),function(){"use strict";"function"==typeof define&&define.amd?define(function(){return qq}):"undefined"!=typeof module&&module.exports?module.exports=qq:global.qq=qq}(),qq.version="5.16.2",qq.supportedFeatures=function(){"use strict";function e(){var e,t=!0;try{e=document.createElement("input"),e.type="file",qq(e).hide(),e.disabled&&(t=!1)}catch(e){t=!1}return t}function t(){return(qq.chrome()||qq.opera())&&void 0!==navigator.userAgent.match(/Chrome\/[1][4-9]|Chrome\/[2-9][0-9]/)}function n(){if(window.XMLHttpRequest){return void 0!==qq.createXhrInstance().withCredentials}return!1}function r(){return void 0!==window.XDomainRequest}function o(){return!!n()||r()}function i(){return void 0!==document.createElement("input").webkitdirectory}function a(){try{return!!window.localStorage&&qq.isFunction(window.localStorage.setItem)}catch(e){return!1}}function u(){var e=document.createElement("span");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&!qq.android()&&!qq.ios()}var c,s,l,q,f,d,p,g,h,v,m,y,b,w,x;return c=e(),q=c&&qq.isXhrUploadSupported(),s=q&&!qq.androidStock(),l=q&&u(),f=l&&function(){var e=document.createElement("input");return e.type="file",!!("webkitdirectory"in(e||document.querySelectorAll("input[type=file]")[0]))}(),d=q&&qq.isFileChunkingSupported(),p=q&&d&&a(),g=q&&t(),h=c&&(void 0!==window.postMessage||q),m=n(),v=r(),y=o(),b=i(),w=q&&void 0!==window.FileReader,x=function(){return!!q&&(!qq.androidStock()&&!qq.iosChrome())}(),{ajaxUploading:q,blobUploading:s,canDetermineSize:q,chunking:d,deleteFileCors:y,deleteFileCorsXdr:v,deleteFileCorsXhr:m,dialogElement:!!window.HTMLDialogElement,fileDrop:l,folderDrop:f,folderSelection:b,imagePreviews:w,imageValidation:w,itemSizeValidation:q,pause:d,progressBar:x,resume:p,scaling:w&&s,tiffPreviews:qq.safari(),unlimitedScaledImageSize:!qq.ios(),uploading:c,uploadCors:h,uploadCustomHeaders:q,uploadNonMultipart:q,uploadViaPaste:g}}(),qq.isGenericPromise=function(e){"use strict";return!!(e&&e.then&&qq.isFunction(e.then))},qq.Promise=function(){"use strict";var e,t,n=[],r=[],o=[],i=0;qq.extend(this,{then:function(o,a){return 0===i?(o&&n.push(o),a&&r.push(a)):i===-1?a&&a.apply(null,t):o&&o.apply(null,e),this},done:function(n){return 0===i?o.push(n):n.apply(null,void 0===t?e:t),this},success:function(){return i=1,e=arguments,n.length&&qq.each(n,function(t,n){n.apply(null,e)}),o.length&&qq.each(o,function(t,n){n.apply(null,e)}),this},failure:function(){return i=-1,t=arguments,r.length&&qq.each(r,function(e,n){n.apply(null,t)}),o.length&&qq.each(o,function(e,n){n.apply(null,t)}),this}})},qq.DragAndDrop=function(e){"use strict";function t(e,t){var n=Array.prototype.slice.call(e);l.callbacks.dropLog("Grabbed "+e.length+" dropped files."),t.dropDisabled(!1),l.callbacks.processingDroppedFilesComplete(n,t.getElement())}function n(e){var t=new qq.Promise;return e.isFile?e.file(function(n){n.qqPath=r(e),f.push(n),t.success()},function(n){l.callbacks.dropLog("Problem parsing '"+e.fullPath+"'. FileError code "+n.code+".","error"),t.failure()}):e.isDirectory&&o(e).then(function(e){var r=e.length;qq.each(e,function(e,o){n(o).done(function(){r-=1,0===r&&t.success()})}),e.length||t.success()},function(n){l.callbacks.dropLog("Problem parsing '"+e.fullPath+"'. FileError code "+n.code+".","error"),t.failure()}),t}function r(e){var t=e.name,n=e.fullPath,r=n.lastIndexOf(t);return n=n.substr(0,r),"/"===n.charAt(0)&&(n=n.substr(1)),n}function o(e,t,n,r){var i=r||new qq.Promise,a=t||e.createReader();return a.readEntries(function(t){var r=n?n.concat(t):t;t.length?setTimeout(function(){o(e,a,r,i)},0):i.success(r)},i.failure),i}function i(e,t){var r=[],o=new qq.Promise;return l.callbacks.processingDroppedFiles(),t.dropDisabled(!0),e.files.length>1&&!l.allowMultipleItems?(l.callbacks.processingDroppedFilesComplete([]),l.callbacks.dropError("tooManyFilesError",""),t.dropDisabled(!1),o.failure()):(f=[],qq.isFolderDropSupported(e)?qq.each(e.items,function(e,t){var i=t.webkitGetAsEntry();i&&(i.isFile?f.push(t.getAsFile()):r.push(n(i).done(function(){r.pop(),0===r.length&&o.success()})))}):f=e.files,0===r.length&&o.success()),o}function a(e){var n=new qq.UploadDropZone({HIDE_ZONES_EVENT_NAME:"qq-hidezones",element:e,onEnter:function(t){qq(e).addClass(l.classes.dropActive),t.stopPropagation()},onLeaveNotDescendants:function(t){qq(e).removeClass(l.classes.dropActive)},onDrop:function(e){i(e.dataTransfer,n).then(function(){t(f,n)},function(){l.callbacks.dropLog("Drop event DataTransfer parsing failed. No files will be uploaded.","error")})}});return d.addDisposer(function(){n.dispose()}),qq(e).hasAttribute("qq-hide-dropzone")&&qq(e).hide(),q.push(n),n}function u(e){var t;return qq.each(e.dataTransfer.types,function(e,n){if("Files"===n)return t=!0,!1}),t}function c(e){return qq.safari()?e.x<0||e.y<0:0===e.x&&0===e.y}function s(){var e=l.dropZoneElements,t=function(){setTimeout(function(){qq.each(e,function(e,t){qq(t).hasAttribute("qq-hide-dropzone")&&qq(t).hide(),qq(t).removeClass(l.classes.dropActive)})},10)};qq.each(e,function(t,n){var r=a(n);e.length&&qq.supportedFeatures.fileDrop&&d.attach(document,"dragenter",function(t){!r.dropDisabled()&&u(t)&&qq.each(e,function(e,t){t instanceof HTMLElement&&qq(t).hasAttribute("qq-hide-dropzone")&&qq(t).css({display:"block"})})})}),d.attach(document,"dragleave",function(e){c(e)&&t()}),d.attach(qq(document).children()[0],"mouseenter",function(e){t()}),d.attach(document,"drop",function(e){u(e)&&(e.preventDefault(),t())}),d.attach(document,"qq-hidezones",t)}var l,q=[],f=[],d=new qq.DisposeSupport;l={dropZoneElements:[],allowMultipleItems:!0,classes:{dropActive:null},callbacks:new qq.DragAndDrop.callbacks},qq.extend(l,e,!0),s(),qq.extend(this,{setupExtraDropzone:function(e){l.dropZoneElements.push(e),a(e)},removeDropzone:function(e){var t,n=l.dropZoneElements;for(t in n)if(n[t]===e)return n.splice(t,1)},dispose:function(){d.dispose(),qq.each(q,function(e,t){t.dispose()})}}),this._testing={},this._testing.extractDirectoryPath=r},qq.DragAndDrop.callbacks=function(){"use strict";return{processingDroppedFiles:function(){},processingDroppedFilesComplete:function(e,t){},dropError:function(e,t){qq.log("Drag & drop error code '"+e+" with these specifics: '"+t+"'","error")},dropLog:function(e,t){qq.log(e,t)}}},qq.UploadDropZone=function(e){"use strict";function t(){return qq.safari()||qq.firefox()&&qq.windows()}function n(e){l||(t?q.attach(document,"dragover",function(e){e.preventDefault()}):q.attach(document,"dragover",function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="none",e.preventDefault())}),l=!0)}function r(e){if(!qq.supportedFeatures.fileDrop)return!1;var t,n=e.dataTransfer,r=qq.safari();return t=!(!qq.ie()||!qq.supportedFeatures.fileDrop)||"none"!==n.effectAllowed,n&&t&&(n.files&&n.files.length||!r&&n.types.contains&&n.types.contains("Files")||n.types.includes&&n.types.includes("Files"))}function o(e){return void 0!==e&&(s=e),s}function i(){function e(){t=document.createEvent("Event"),t.initEvent(u.HIDE_ZONES_EVENT_NAME,!0,!0)}var t;if(window.CustomEvent)try{t=new CustomEvent(u.HIDE_ZONES_EVENT_NAME)}catch(t){e()}else e();document.dispatchEvent(t)}function a(){q.attach(c,"dragover",function(e){if(r(e)){var t=qq.ie()&&qq.supportedFeatures.fileDrop?null:e.dataTransfer.effectAllowed;e.dataTransfer.dropEffect="move"===t||"linkMove"===t?"move":"copy",e.stopPropagation(),e.preventDefault()}}),q.attach(c,"dragenter",function(e){if(!o()){if(!r(e))return;u.onEnter(e)}}),q.attach(c,"dragleave",function(e){if(r(e)){u.onLeave(e);var t=document.elementFromPoint(e.clientX,e.clientY);qq(this).contains(t)||u.onLeaveNotDescendants(e)}}),q.attach(c,"drop",function(e){if(!o()){if(!r(e))return;e.preventDefault(),e.stopPropagation(),u.onDrop(e),i()}})}var u,c,s,l,q=new qq.DisposeSupport;u={element:null,onEnter:function(e){},onLeave:function(e){},onLeaveNotDescendants:function(e){},onDrop:function(e){}},qq.extend(u,e),c=u.element,n(),a(),qq.extend(this,{dropDisabled:function(e){return o(e)},dispose:function(){q.dispose()},getElement:function(){return c}}),this._testing={},this._testing.isValidFileDrag=r}}(window); +//# sourceMappingURL=dnd.min.js.map \ No newline at end of file diff --git a/resources/fine-uploader/dnd.min.js.map b/resources/fine-uploader/dnd.min.js.map new file mode 100644 index 0000000..3927f66 --- /dev/null +++ b/resources/fine-uploader/dnd.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["?","../client/js/util.js","../client/js/export.js","../client/js/version.js","../client/js/features.js","../client/js/promise.js","../client/js/dnd.js"],"names":["global","qq","element","hide","style","display","this","attach","type","fn","addEventListener","attachEvent","detach","removeEventListener","detachEvent","contains","descendant","compareDocumentPosition","insertBefore","elementB","parentNode","remove","removeChild","css","styles","Error","opacity","filter","Math","round","extend","hasClass","name","considerParent","re","RegExp","test","className","addClass","removeClass","replace","getByClass","first","candidates","result","querySelector","querySelectorAll","getElementsByTagName","each","idx","val","push","getFirstByClass","children","child","firstChild","nodeType","nextSibling","setText","text","innerText","textContent","clearText","hasAttribute","attrName","attrVal","exec","getAttribute","undefined","canvasToBlob","canvas","mime","quality","dataUriToBlob","toDataURL","dataUri","arrayBuffer","byteString","intArray","mimeString","createBlob","data","BlobBuilder","window","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","blobBuilder","append","getBlob","Blob","split","indexOf","atob","decodeURI","ArrayBuffer","length","Uint8Array","character","charCodeAt","log","message","level","console","isObject","variable","Object","prototype","toString","call","isFunction","isArray","value","buffer","constructor","isItemList","maybeItemList","isNodeList","maybeNodeList","item","namedItem","isString","maybeString","trimStr","string","String","trim","format","str","args","Array","slice","arguments","newStr","nextIdxToReplace","substring","isFile","maybeFile","File","isFileList","maybeFileList","FileList","isFileOrInput","maybeFileOrInput","isInput","maybeInput","notFile","evaluateType","normalizedType","toLowerCase","HTMLInputElement","tagName","isBlob","maybeBlob","isXhrUploadSupported","input","document","createElement","multiple","FormData","createXhrInstance","upload","XMLHttpRequest","ActiveXObject","error","isFolderDropSupported","dataTransfer","items","webkitGetAsEntry","isFileChunkingSupported","androidStock","webkitSlice","mozSlice","sliceBlob","fileOrBlob","start","end","arrayBufferToHex","bytesAsHex","bytes","byt","byteAsHexStr","readBlobToHex","blob","startOffset","initialBlob","fileReader","FileReader","promise","Promise","onload","success","onerror","failure","readAsArrayBuffer","second","extendNested","prop","override","target","sourceFn","super_","source","srcPropName","srcPropVal","arr","elt","from","len","hasOwnProperty","getUniqueId","c","r","random","ie","navigator","userAgent","ie7","ie8","ie10","ie11","edge","safari","vendor","chrome","opera","firefox","windows","platform","android","ios6","ios","ios7","ios8","ios800","iosChrome","iosSafari","iosSafariWebView","preventDefault","e","returnValue","toElement","div","html","innerHTML","iterableItem","callback","keyOrIndex","retVal","Storage","key","getItem","charAt","bind","oldFunc","context","newArgs","concat","apply","obj2url","obj","temp","prefixDone","uristrings","prefix","add","nextObj","i","nextTemp","encodeURIComponent","join","obj2FormData","formData","arrayKeyName","obj2Inputs","form","setAttribute","appendChild","parseJson","json","JSON","parse","eval","getExtension","filename","extIdx","lastIndexOf","substr","getFilename","blobOrFileInput","fileName","DisposeSupport","disposers","dispose","disposer","shift","addDisposer","disposeFunction","define","amd","module","exports","version","supportedFeatures","testSupportsFileInputElement","tempInput","supported","disabled","ex","isChrome14OrHigher","match","isCrossOriginXhrSupported","withCredentials","isXdrSupported","XDomainRequest","isCrossOriginAjaxSupported","isFolderSelectionSupported","webkitdirectory","isLocalStorageSupported","localStorage","setItem","isDragAndDropSupported","span","supportsUploading","supportsUploadingBlobs","supportsFileDrop","supportsAjaxFileUploading","supportsFolderDrop","supportsChunking","supportsResume","supportsUploadViaPaste","supportsUploadCors","supportsDeleteFileXdr","supportsDeleteFileCorsXhr","supportsDeleteFileCors","supportsFolderSelection","supportsImagePreviews","supportsUploadProgress","postMessage","ajaxUploading","blobUploading","canDetermineSize","chunking","deleteFileCors","deleteFileCorsXdr","deleteFileCorsXhr","dialogElement","HTMLDialogElement","fileDrop","folderDrop","folderSelection","imagePreviews","imageValidation","itemSizeValidation","pause","progressBar","resume","scaling","tiffPreviews","unlimitedScaledImageSize","uploading","uploadCors","uploadCustomHeaders","uploadNonMultipart","uploadViaPaste","isGenericPromise","maybePromise","then","successArgs","failureArgs","successCallbacks","failureCallbacks","doneCallbacks","state","onSuccess","onFailure","done","DragAndDrop","o","uploadDroppedFiles","files","uploadDropZone","filesAsArray","options","callbacks","dropLog","dropDisabled","processingDroppedFilesComplete","getElement","traverseFileTree","entry","parseEntryPromise","file","qqPath","extractDirectoryPath","droppedFiles","fileError","fullPath","code","isDirectory","getFilesInDirectory","entries","entriesLeft","indexOfNameInFullPath","reader","accumEntries","existingPromise","dirReader","createReader","readEntries","newEntries","setTimeout","handleDataTransfer","pendingFolderPromises","handleDataTransferPromise","processingDroppedFiles","allowMultipleItems","dropError","getAsFile","pop","setupDropzone","dropArea","dropZone","UploadDropZone","HIDE_ZONES_EVENT_NAME","onEnter","classes","dropActive","stopPropagation","onLeaveNotDescendants","onDrop","disposeSupport","uploadDropZones","isFileDrag","dragEvent","fileDrag","types","leavingDocumentOut","x","y","setupDragDrop","dropZones","dropZoneElements","maybeHideDropZones","HTMLElement","setupExtraDropzone","removeDropzone","dzs","splice","_testing","targetEl","errorSpecifics","dragoverShouldBeCanceled","disableDropOutside","dropOutsideDisabled","dropEffect","isValidFileDrag","effectTest","dt","isSafari","effectAllowed","includes","isOrSetDropDisabled","isDisabled","preventDrop","triggerHidezonesEvent","triggerUsingOldApi","hideZonesEvent","createEvent","initEvent","CustomEvent","err","dispatchEvent","attachEvents","effect","onLeave","relatedTarget","elementFromPoint","clientX","clientY"],"mappings":";CAAA,SAAUA,QCEV,GAAIC,IAAK,SAASC,GACd,YAEA,QACIC,KAAM,WAEF,MADAD,GAAQE,MAAMC,QAAU,OACjBC,MAIXC,OAAQ,SAASC,EAAMC,GAMnB,MALIP,GAAQQ,iBACRR,EAAQQ,iBAAiBF,EAAMC,GAAI,GAC5BP,EAAQS,aACfT,EAAQS,YAAY,KAAOH,EAAMC,GAE9B,WACHR,GAAGC,GAASU,OAAOJ,EAAMC,KAIjCG,OAAQ,SAASJ,EAAMC,GAMnB,MALIP,GAAQW,oBACRX,EAAQW,oBAAoBL,EAAMC,GAAI,GAC/BP,EAAQS,aACfT,EAAQY,YAAY,KAAON,EAAMC,GAE9BH,MAGXS,SAAU,SAASC,GAKf,QAAKA,IAKDd,IAAYc,IAIZd,EAAQa,SACDb,EAAQa,SAASC,MAGgC,EAA9CA,EAAWC,wBAAwBf,OAOrDgB,aAAc,SAASC,GAEnB,MADAA,GAASC,WAAWF,aAAahB,EAASiB,GACnCb,MAGXe,OAAQ,WAEJ,MADAnB,GAAQkB,WAAWE,YAAYpB,GACxBI,MAOXiB,IAAK,SAASC,GAEV,GAAqB,MAAjBtB,EAAQE,MACR,KAAM,IAAIH,IAAGwB,MAAM,6EAWvB,OAPsB,OAAlBD,EAAOE,SAC8B,gBAA1BxB,GAAQE,MAAMsB,SAAqD,SAArBxB,EAAe,UACpEsB,EAAOG,OAAS,iBAAmBC,KAAKC,MAAM,IAAML,EAAOE,SAAW,KAG9EzB,GAAG6B,OAAO5B,EAAQE,MAAOoB,GAElBlB,MAGXyB,SAAU,SAASC,EAAMC,GACrB,GAAIC,GAAK,GAAIC,QAAO,QAAUH,EAAO,QACrC,OAAOE,GAAGE,KAAKlC,EAAQmC,eAAiBJ,IAAkBC,EAAGE,KAAKlC,EAAQkB,WAAWiB,aAGzFC,SAAU,SAASN,GAIf,MAHK/B,IAAGC,GAAS6B,SAASC,KACtB9B,EAAQmC,WAAa,IAAML,GAExB1B,MAGXiC,YAAa,SAASP,GAClB,GAAIE,GAAK,GAAIC,QAAO,QAAUH,EAAO,QAErC,OADA9B,GAAQmC,UAAYnC,EAAQmC,UAAUG,QAAQN,EAAI,KAAKM,QAAQ,aAAc,IACtElC,MAGXmC,WAAY,SAASJ,EAAWK,GAC5B,GAAIC,GACAC,IAEJ,OAAIF,IAASxC,EAAQ2C,cACV3C,EAAQ2C,cAAc,IAAMR,GAE9BnC,EAAQ4C,iBACN5C,EAAQ4C,iBAAiB,IAAMT,IAG1CM,EAAazC,EAAQ6C,qBAAqB,KAE1C9C,GAAG+C,KAAKL,EAAY,SAASM,EAAKC,GAC1BjD,GAAGiD,GAAKnB,SAASM,IACjBO,EAAOO,KAAKD,KAGbR,EAAQE,EAAO,GAAKA,IAG/BQ,gBAAiB,SAASf,GACtB,MAAOpC,IAAGC,GAASuC,WAAWJ,GAAW,IAG7CgB,SAAU,WAIN,IAHA,GAAIA,MACAC,EAAQpD,EAAQqD,WAEbD,GACoB,IAAnBA,EAAME,UACNH,EAASF,KAAKG,GAElBA,EAAQA,EAAMG,WAGlB,OAAOJ,IAGXK,QAAS,SAASC,GAGd,MAFAzD,GAAQ0D,UAAYD,EACpBzD,EAAQ2D,YAAcF,EACfrD,MAGXwD,UAAW,WACP,MAAO7D,IAAGC,GAASwD,QAAQ,KAK/BK,aAAc,SAASC,GACnB,GAAIC,EAEJ,OAAI/D,GAAQ6D,eAEH7D,EAAQ6D,aAAaC,IAKkC,MAArD,WAAaE,KAAKhE,EAAQiE,aAAaH,KAG9CC,EAAU/D,EAAQ8D,GAEFI,SAAZH,GAKiC,MAA9B,WAAaC,KAAKD,QAMxC,WACG,YAEAhE,IAAGoE,aAAe,SAASC,EAAQC,EAAMC,GACrC,MAAOvE,IAAGwE,cAAcH,EAAOI,UAAUH,EAAMC,KAGnDvE,GAAGwE,cAAgB,SAASE,GACxB,GAAIC,GAAaC,EAgBbC,EAAUC,EAfVC,EAAa,SAASC,EAAMV,GACxB,GAAIW,GAAcC,OAAOD,aACjBC,OAAOC,mBACPD,OAAOE,gBACPF,OAAOG,cACXC,EAAcL,GAAe,GAAIA,EAErC,OAAIK,IACAA,EAAYC,OAAOP,GACZM,EAAYE,QAAQlB,IAGpB,GAAImB,OAAMT,IAAQzE,KAAM+D,IAyB3C,OAlBIM,GADAF,EAAQgB,MAAM,KAAK,GAAGC,QAAQ,WAAa,EAC9BC,KAAKlB,EAAQgB,MAAM,KAAK,IAGxBG,UAAUnB,EAAQgB,MAAM,KAAK,IAI9CZ,EAAaJ,EAAQgB,MAAM,KAAK,GAC3BA,MAAM,KAAK,GACXA,MAAM,KAAK,GAGhBf,EAAc,GAAImB,aAAYlB,EAAWmB,QACzClB,EAAW,GAAImB,YAAWrB,GAC1B3E,GAAG+C,KAAK6B,EAAY,SAAS5B,EAAKiD,GAC9BpB,EAAS7B,GAAOiD,EAAUC,WAAW,KAGlCnB,EAAWJ,EAAaG,IAGnC9E,GAAGmG,IAAM,SAASC,EAASC,GACnBnB,OAAOoB,UACFD,GAAmB,SAAVA,EAKNnB,OAAOoB,QAAQD,GACfnB,OAAOoB,QAAQD,GAAOD,GAGtBlB,OAAOoB,QAAQH,IAAI,IAAME,EAAQ,KAAOD,GAR5ClB,OAAOoB,QAAQH,IAAIC,KAc/BpG,GAAGuG,SAAW,SAASC,GACnB,MAAOA,KAAaA,EAASjD,UAAyD,oBAA7CkD,OAAOC,UAAUC,SAASC,KAAKJ,IAG5ExG,GAAG6G,WAAa,SAASL,GACrB,MAA6B,kBAAf,IASlBxG,GAAG8G,QAAU,SAASC,GAClB,MAAiD,mBAA1CN,OAAOC,UAAUC,SAASC,KAAKG,IACjCA,GAAS7B,OAAOY,aAAeiB,EAAMC,QAAUD,EAAMC,OAAOC,cAAgBnB,aAIrF9F,GAAGkH,WAAa,SAASC,GACrB,MAAyD,kCAAlDV,OAAOC,UAAUC,SAASC,KAAKO,IAK1CnH,GAAGoH,WAAa,SAASC,GACrB,MAAyD,sBAAlDZ,OAAOC,UAAUC,SAASC,KAAKS,IAGjCA,EAAcC,MAAQD,EAAcE,WAG7CvH,GAAGwH,SAAW,SAASC,GACnB,MAAuD,oBAAhDhB,OAAOC,UAAUC,SAASC,KAAKa,IAG1CzH,GAAG0H,QAAU,SAASC,GAClB,MAAIC,QAAOlB,UAAUmB,KACVF,EAAOE,OAGXF,EAAOpF,QAAQ,aAAc,KAOxCvC,GAAG8H,OAAS,SAASC,GAEjB,GAAIC,GAAQC,MAAMvB,UAAUwB,MAAMtB,KAAKuB,UAAW,GAC9CC,EAASL,EACTM,EAAmBD,EAAOzC,QAAQ,KAetC,OAbA3F,IAAG+C,KAAKiF,EAAM,SAAShF,EAAKC,GAQxB,GAJAmF,EAHgBA,EAAOE,UAAU,EAAGD,GAGfpF,EAFNmF,EAAOE,UAAUD,EAAmB,GAGnDA,EAAmBD,EAAOzC,QAAQ,KAAM0C,EAAmBpF,EAAI8C,QAG3DsC,EAAmB,EACnB,OAAO,IAIRD,GAGXpI,GAAGuI,OAAS,SAASC,GACjB,MAAOtD,QAAOuD,MAAsD,kBAA9ChC,OAAOC,UAAUC,SAASC,KAAK4B,IAGzDxI,GAAG0I,WAAa,SAASC,GACrB,MAAOzD,QAAO0D,UAA8D,sBAAlDnC,OAAOC,UAAUC,SAASC,KAAK+B,IAG7D3I,GAAG6I,cAAgB,SAASC,GACxB,MAAO9I,IAAGuI,OAAOO,IAAqB9I,GAAG+I,QAAQD,IAGrD9I,GAAG+I,QAAU,SAASC,EAAYC,GAC9B,GAAIC,GAAe,SAAS3I,GACxB,GAAI4I,GAAiB5I,EAAK6I,aAE1B,OAAIH,GAC0B,SAAnBE,EAGe,SAAnBA,EAGX,UAAIjE,OAAOmE,kBAC4C,8BAA/C5C,OAAOC,UAAUC,SAASC,KAAKoC,IAC3BA,EAAWzI,MAAQ2I,EAAaF,EAAWzI,WAKnDyI,EAAWM,SAC8B,UAArCN,EAAWM,QAAQF,eACfJ,EAAWzI,MAAQ2I,EAAaF,EAAWzI,QAS3DP,GAAGuJ,OAAS,SAASC,GACjB,GAAItE,OAAOO,MAAsD,kBAA9CgB,OAAOC,UAAUC,SAASC,KAAK4C,GAC9C,OAAO,GAIfxJ,GAAGyJ,qBAAuB,WACtB,GAAIC,GAAQC,SAASC,cAAc,QAGnC,OAFAF,GAAMnJ,KAAO,OAGU4D,SAAnBuF,EAAMG,UACc,mBAATpB,OACa,mBAAbqB,WACoC,SAAnC9J,GAAG+J,oBAAqBC,QAI5ChK,GAAG+J,kBAAoB,WACnB,GAAI7E,OAAO+E,eACP,MAAO,IAAIA,eAGf,KACI,MAAO,IAAIC,eAAc,sBAE7B,MAAOC,GAEH,MADAnK,IAAGmG,IAAI,wCAAyC,SACzC,OAIfnG,GAAGoK,sBAAwB,SAASC,GAChC,MAAOA,GAAaC,OAChBD,EAAaC,MAAMvE,OAAS,GAC5BsE,EAAaC,MAAM,GAAGC,kBAG9BvK,GAAGwK,wBAA0B,WACzB,OAAQxK,GAAGyK,gBACPzK,GAAGyJ,yBACuBtF,SAAzBsE,KAAK/B,UAAUwB,OAAsD/D,SAA/BsE,KAAK/B,UAAUgE,aAAyDvG,SAA5BsE,KAAK/B,UAAUiE,WAG1G3K,GAAG4K,UAAY,SAASC,EAAYC,EAAOC,GAGvC,OAFaF,EAAW3C,OAAS2C,EAAWF,UAAYE,EAAWH,aAErD9D,KAAKiE,EAAYC,EAAOC,IAG1C/K,GAAGgL,iBAAmB,SAAShE,GAC3B,GAAIiE,GAAa,GACbC,EAAQ,GAAIlF,YAAWgB,EAY3B,OAVAhH,IAAG+C,KAAKmI,EAAO,SAASlI,EAAKmI,GACzB,GAAIC,GAAeD,EAAIxE,SAAS,GAE5ByE,GAAarF,OAAS,IACtBqF,EAAe,IAAMA,GAGzBH,GAAcG,IAGXH,GAGXjL,GAAGqL,cAAgB,SAASC,EAAMC,EAAaxF,GAC3C,GAAIyF,GAAcxL,GAAG4K,UAAUU,EAAMC,EAAaA,EAAcxF,GAC5D0F,EAAa,GAAIC,YACjBC,EAAU,GAAI3L,IAAG4L,OAUrB,OARAH,GAAWI,OAAS,WAChBF,EAAQG,QAAQ9L,GAAGgL,iBAAiBS,EAAW9I,UAGnD8I,EAAWM,QAAUJ,EAAQK,QAE7BP,EAAWQ,kBAAkBT,GAEtBG,GAGX3L,GAAG6B,OAAS,SAASY,EAAOyJ,EAAQC,GAahC,MAZAnM,IAAG+C,KAAKmJ,EAAQ,SAASE,EAAMnJ,GACvBkJ,GAAgBnM,GAAGuG,SAAStD,IACRkB,SAAhB1B,EAAM2J,KACN3J,EAAM2J,OAEVpM,GAAG6B,OAAOY,EAAM2J,GAAOnJ,GAAK,IAG5BR,EAAM2J,GAAQnJ,IAIfR,GAaXzC,GAAGqM,SAAW,SAASC,EAAQC,GAC3B,GAAIC,MACAC,EAASF,EAASC,EAUtB,OARAxM,IAAG+C,KAAK0J,EAAQ,SAASC,EAAaC,GACNxI,SAAxBmI,EAAOI,KACPF,EAAOE,GAAeJ,EAAOI,IAGjCJ,EAAOI,GAAeC,IAGnBL,GAMXtM,GAAG2F,QAAU,SAASiH,EAAKC,EAAKC,GAC5B,GAAIF,EAAIjH,QACJ,MAAOiH,GAAIjH,QAAQkH,EAAKC,EAG5BA,GAAOA,GAAQ,CACf,IAAIC,GAAMH,EAAI7G,MAMd,KAJI+G,EAAO,IACPA,GAAQC,GAGLD,EAAOC,EAAKD,GAAQ,EACvB,GAAIF,EAAII,eAAeF,IAASF,EAAIE,KAAUD,EAC1C,MAAOC,EAGf,QAAO,GAIX9M,GAAGiN,YAAc,WACb,MAAO,uCAAuC1K,QAAQ,QAAS,SAAS2K,GAEpE,GAAIC,GAAoB,GAAhBxL,KAAKyL,SAAgB,CAC7B,QADyC,KAALF,EAAWC,EAAS,EAAJA,EAAU,GACrDxG,SAAS,OAM1B3G,GAAGqN,GAAK,WACJ,MAAOC,WAAUC,UAAU5H,QAAQ,WAAY,GAC3C2H,UAAUC,UAAU5H,QAAQ,cAAe,GAGnD3F,GAAGwN,IAAM,WACL,MAAOF,WAAUC,UAAU5H,QAAQ,aAAc,GAGrD3F,GAAGyN,IAAM,WACL,MAAOH,WAAUC,UAAU5H,QAAQ,aAAc,GAGrD3F,GAAG0N,KAAO,WACN,MAAOJ,WAAUC,UAAU5H,QAAQ,cAAe,GAGtD3F,GAAG2N,KAAO,WACN,MAAO3N,IAAGqN,MAAQC,UAAUC,UAAU5H,QAAQ,YAAa,GAG/D3F,GAAG4N,KAAO,WACN,MAAON,WAAUC,UAAU5H,QAAQ,SAAW,GAGlD3F,GAAG6N,OAAS,WACR,MAA4B1J,UAArBmJ,UAAUQ,QAAwBR,UAAUQ,OAAOnI,QAAQ,YAAa,GAGnF3F,GAAG+N,OAAS,WACR,MAA4B5J,UAArBmJ,UAAUQ,QAAwBR,UAAUQ,OAAOnI,QAAQ,aAAc,GAGpF3F,GAAGgO,MAAQ,WACP,MAA4B7J,UAArBmJ,UAAUQ,QAAwBR,UAAUQ,OAAOnI,QAAQ,YAAa,GAGnF3F,GAAGiO,QAAU,WACT,OAASjO,GAAG4N,SAAW5N,GAAG2N,QAAUL,UAAUC,UAAU5H,QAAQ,cAAe,GAA2BxB,SAArBmJ,UAAUQ,QAA6C,KAArBR,UAAUQ,QAGrI9N,GAAGkO,QAAU,WACT,MAA8B,UAAvBZ,UAAUa,UAGrBnO,GAAGoO,QAAU,WACT,MAAOd,WAAUC,UAAUnE,cAAczD,QAAQ,cAAe,GAKpE3F,GAAGyK,aAAe,WACd,MAAOzK,IAAGoO,WAAad,UAAUC,UAAUnE,cAAczD,QAAQ,UAAY,GAGjF3F,GAAGqO,KAAO,WACN,MAAOrO,IAAGsO,OAAShB,UAAUC,UAAU5H,QAAQ,aAAc,GAGjE3F,GAAGuO,KAAO,WACN,MAAOvO,IAAGsO,OAAShB,UAAUC,UAAU5H,QAAQ,aAAc,GAGjE3F,GAAGwO,KAAO,WACN,MAAOxO,IAAGsO,OAAShB,UAAUC,UAAU5H,QAAQ,aAAc,GAIjE3F,GAAGyO,OAAS,WACR,MAAOzO,IAAGsO,OAAShB,UAAUC,UAAU5H,QAAQ,eAAgB,GAGnE3F,GAAGsO,IAAM,WAEL,MAAOhB,WAAUC,UAAU5H,QAAQ,WAAY,GACxC2H,UAAUC,UAAU5H,QAAQ,WAAY,GACxC2H,UAAUC,UAAU5H,QAAQ,aAAc,GAGrD3F,GAAG0O,UAAY,WACX,MAAO1O,IAAGsO,OAAShB,UAAUC,UAAU5H,QAAQ,YAAa,GAGhE3F,GAAG2O,UAAY,WACX,MAAO3O,IAAGsO,QAAUtO,GAAG0O,aAAepB,UAAUC,UAAU5H,QAAQ,aAAc,GAGpF3F,GAAG4O,iBAAmB,WAClB,MAAO5O,IAAGsO,QAAUtO,GAAG0O,cAAgB1O,GAAG2O,aAM9C3O,GAAG6O,eAAiB,SAASC,GACrBA,EAAED,eACFC,EAAED,iBAEFC,EAAEC,aAAc,GAQxB/O,GAAGgP,UAAa,WACZ,GAAIC,GAAMtF,SAASC,cAAc,MACjC,OAAO,UAASsF,GACZD,EAAIE,UAAYD,CAChB,IAAIjP,GAAUgP,EAAI3L,UAElB,OADA2L,GAAI5N,YAAYpB,GACTA,MAKfD,GAAG+C,KAAO,SAASqM,EAAcC,GAC7B,GAAIC,GAAYC,CAEhB,IAAIH,EAEA,GAAIlK,OAAOsK,SAAWJ,EAAanI,cAAgB/B,OAAOsK,QACtD,IAAKF,EAAa,EAAGA,EAAaF,EAAarJ,SAC3CwJ,EAASF,EAASD,EAAaK,IAAIH,GAAaF,EAAaM,QAAQN,EAAaK,IAAIH,KAClFC,KAAW,GAFoCD,SAStD,IAAItP,GAAG8G,QAAQsI,IAAiBpP,GAAGkH,WAAWkI,IAAiBpP,GAAGoH,WAAWgI,GAC9E,IAAKE,EAAa,EAAGA,EAAaF,EAAarJ,SAC3CwJ,EAASF,EAASC,EAAYF,EAAaE,IACvCC,KAAW,GAFoCD,SAOtD,IAAItP,GAAGwH,SAAS4H,GACjB,IAAKE,EAAa,EAAGA,EAAaF,EAAarJ,SAC3CwJ,EAASF,EAASC,EAAYF,EAAaO,OAAOL,IAC9CC,KAAW,GAFoCD,SAQvD,KAAKA,IAAcF,GACf,GAAI3I,OAAOC,UAAUsG,eAAepG,KAAKwI,EAAcE,KACnDC,EAASF,EAASC,EAAYF,EAAaE,IACvCC,KAAW,GACX,OASxBvP,GAAG4P,KAAO,SAASC,EAASC,GACxB,GAAI9P,GAAG6G,WAAWgJ,GAAU,CACxB,GAAI7H,GAAQC,MAAMvB,UAAUwB,MAAMtB,KAAKuB,UAAW,EAElD,OAAO,YACH,GAAI4H,GAAU/P,GAAG6B,UAAWmG,EAI5B,OAHIG,WAAUpC,SACVgK,EAAUA,EAAQC,OAAO/H,MAAMvB,UAAUwB,MAAMtB,KAAKuB,aAEjD0H,EAAQI,MAAMH,EAASC,IAItC,KAAM,IAAIvO,OAAM,wCAmBpBxB,GAAGkQ,QAAU,SAASC,EAAKC,EAAMC,GAE7B,GAAIC,MACAC,EAAS,IACTC,EAAM,SAASC,EAASC,GACpB,GAAIC,GAAWP,EACR,QAAQjO,KAAKiO,GACdA,EACAA,EAAO,IAAMM,EAAI,IACjBA,CACY,eAAbC,GAAoC,cAAND,GAC/BJ,EAAWpN,KACa,gBAAZuN,GACFzQ,GAAGkQ,QAAQO,EAASE,GAAU,GACe,sBAA5ClK,OAAOC,UAAUC,SAASC,KAAK6J,GAChCG,mBAAmBD,GAAY,IAAMC,mBAAmBH,KACxDG,mBAAmBD,GAAY,IAAMC,mBAAmBH,IAqB9E,QAhBKJ,GAAcD,GACfG,EAAU,KAAKpO,KAAKiO,GAAU,MAAMjO,KAAKiO,GAAS,GAAK,IAAM,IAC7DE,EAAWpN,KAAKkN,GAChBE,EAAWpN,KAAKlD,GAAGkQ,QAAQC,KACqB,mBAAxC1J,OAAOC,UAAUC,SAASC,KAAKuJ,IAA8C,SAARA,EAC7EnQ,GAAG+C,KAAKoN,EAAK,SAASnN,EAAKC,GACvBuN,EAAIvN,EAAKD,KAEU,SAARmN,GAAiC,OAARA,GAAiC,gBAARA,GACjEnQ,GAAG+C,KAAKoN,EAAK,SAAS/D,EAAMnJ,GACxBuN,EAAIvN,EAAKmJ,KAGbkE,EAAWpN,KAAK0N,mBAAmBR,GAAQ,IAAMQ,mBAAmBT,IAGpEC,EACOE,EAAWO,KAAKN,GAEhBD,EAAWO,KAAKN,GAClBhO,QAAQ,KAAM,IACdA,QAAQ,OAAQ,MAI7BvC,GAAG8Q,aAAe,SAASX,EAAKY,EAAUC,GAmBtC,MAlBKD,KACDA,EAAW,GAAIjH,WAGnB9J,GAAG+C,KAAKoN,EAAK,SAASV,EAAKxM,GACvBwM,EAAMuB,EAAeA,EAAe,IAAMvB,EAAM,IAAMA,EAElDzP,GAAGuG,SAAStD,GACZjD,GAAG8Q,aAAa7N,EAAK8N,EAAUtB,GAE1BzP,GAAG6G,WAAW5D,GACnB8N,EAASxL,OAAOkK,EAAKxM,KAGrB8N,EAASxL,OAAOkK,EAAKxM,KAItB8N,GAGX/Q,GAAGiR,WAAa,SAASd,EAAKe,GAC1B,GAAIxH,EAeJ,OAbKwH,KACDA,EAAOvH,SAASC,cAAc,SAGlC5J,GAAG8Q,aAAaX,GACZ5K,OAAQ,SAASkK,EAAKxM,GAClByG,EAAQC,SAASC,cAAc,SAC/BF,EAAMyH,aAAa,OAAQ1B,GAC3B/F,EAAMyH,aAAa,QAASlO,GAC5BiO,EAAKE,YAAY1H,MAIlBwH,GAOXlR,GAAGqR,UAAY,SAASC,MAEpB,MAAIpM,QAAOqM,MAAQvR,GAAG6G,WAAW0K,KAAKC,OAC3BD,KAAKC,MAAMF,MAEXG,KAAK,IAAMH,KAAO,MAUjCtR,GAAG0R,aAAe,SAASC,GACvB,GAAIC,GAASD,EAASE,YAAY,KAAO,CAEzC,IAAID,EAAS,EACT,MAAOD,GAASG,OAAOF,EAAQD,EAAS5L,OAAS6L,IAIzD5R,GAAG+R,YAAc,SAASC,GAGtB,MAAIhS,IAAG+I,QAAQiJ,GAEJA,EAAgBjL,MAAMxE,QAAQ,YAAa,IAE7CvC,GAAGuI,OAAOyJ,IACkB,OAA7BA,EAAgBC,UAAkD9N,SAA7B6N,EAAgBC,SAC9CD,EAAgBC,SAIxBD,EAAgBjQ,MAM3B/B,GAAGkS,eAAiB,WAChB,GAAIC,KAEJ,QAEIC,QAAS,WACL,GAAIC,EACJ,GACIA,GAAWF,EAAUG,QACjBD,GACAA,UAGDA,IAIX/R,OAAQ,WACJ,GAAI0H,GAAOG,SAEX9H,MAAKkS,YAAYvS,GAAGgI,EAAK,IAAI1H,OAAO2P,MAAM5P,KAAM4H,MAAMvB,UAAUwB,MAAMtB,KAAKuB,UAAW,MAI1FoK,YAAa,SAASC,GAClBL,EAAUjP,KAAKsP,SCt2B9B,WACG,YACsB,mBAAXC,SAAyBA,OAAOC,IACvCD,OAAO,WACH,MAAOzS,MAGY,mBAAX2S,SAA0BA,OAAOC,QAC7CD,OAAOC,QAAU5S,GAGjBD,OAAOC,GAAKA,MCXpBA,GAAG6S,QAAU,SCAb7S,GAAG8S,kBAAqB,WACpB,YAkBA,SAASC,KACL,GACIC,GADAC,GAAY,CAGhB,KACID,EAAYrJ,SAASC,cAAc,SACnCoJ,EAAUzS,KAAO,OACjBP,GAAGgT,GAAW9S,OAEV8S,EAAUE,WACVD,GAAY,GAGpB,MAAOE,GACHF,GAAY,EAGhB,MAAOA,GAIX,QAASG,KACL,OAAQpT,GAAG+N,UAAY/N,GAAGgO,UAC+C7J,SAArEmJ,UAAUC,UAAU8F,MAAM,uCAIlC,QAASC,KACL,GAAIpO,OAAO+E,eAAgB,CAIvB,MAA+B9F,UAHrBnE,GAAG+J,oBAGFwJ,gBAGf,OAAO,EAIX,QAASC,KACL,MAAiCrP,UAA1Be,OAAOuO,eAKlB,QAASC,KACL,QAAIJ,KAIGE,IAGX,QAASG,KAEL,MAA2DxP,UAApDwF,SAASC,cAAc,SAASgK,gBAG3C,QAASC,KACL,IACI,QAAS3O,OAAO4O,cAEZ9T,GAAG6G,WAAW3B,OAAO4O,aAAaC,SAE1C,MAAO5J,GAEH,OAAO,GAIf,QAAS6J,KACL,GAAIC,GAAOtK,SAASC,cAAc,OAElC,QAAQ,aAAeqK,IAAS,eAAiBA,IAAQ,UAAYA,MAChEjU,GAAGoO,YAAcpO,GAAGsO,MA1F7B,GAAI4F,GACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CAwHJ,OAzCAd,GAAoBnB,IAEpBsB,EAA4BH,GAAqBlU,GAAGyJ,uBAEpD0K,EAAyBE,IAA8BrU,GAAGyK,eAE1D2J,EAAmBC,GAA6BL,IAGhDM,EAAqBF,GAAqB,WACtC,GAAI1K,GAAQC,SAASC,cAAc,QAGnC,OADAF,GAAMnJ,KAAO,UACH,oBAAsBmJ,GAASC,SAAS9G,iBAAiB,oBAAoB,QAG3F0R,EAAmBF,GAA6BrU,GAAGwK,0BAEnDgK,EAAiBH,GAA6BE,GAAoBV,IAElEY,EAAyBJ,GAA6BjB,IAEtDsB,EAAqBR,IAA6C/P,SAAvBe,OAAO+P,aAA6BZ,GAE/EO,EAA4BtB,IAE5BqB,EAAwBnB,IAExBqB,EAAyBnB,IAEzBoB,EAA0BnB,IAE1BoB,EAAwBV,GAAmDlQ,SAAtBe,OAAOwG,WAE5DsJ,EAA0B,WACtB,QAAIX,KACQrU,GAAGyK,iBAAmBzK,GAAG0O,iBAMrCwG,cAAeb,EACfc,cAAehB,EACfiB,iBAAkBf,EAClBgB,SAAUd,EACVe,eAAgBT,EAChBU,kBAAmBZ,EACnBa,kBAAmBZ,EACnBa,gBAAiBvQ,OAAOwQ,kBACxBC,SAAUvB,EACVwB,WAAYtB,EACZuB,gBAAiBf,EACjBgB,cAAef,EACfgB,gBAAiBhB,EACjBiB,mBAAoB3B,EACpB4B,MAAO1B,EACP2B,YAAalB,EACbmB,OAAQ3B,EACR4B,QAASrB,GAAyBZ,EAClCkC,aAAcrW,GAAG6N,SACjByI,0BAA2BtW,GAAGsO,MAC9BiI,UAAWrC,EACXsC,WAAY9B,EACZ+B,oBAAqBpC,EACrBqC,mBAAoBrC,EACpBsC,eAAgBlC,MChKxBzU,GAAG4W,iBAAmB,SAASC,GAC3B,YACA,UAAUA,GAAgBA,EAAaC,MAAQ9W,GAAG6G,WAAWgQ,EAAaC,QAG9E9W,GAAG4L,QAAU,WACT,YAEA,IAAImL,GAAaC,EACbC,KACAC,KACAC,KACAC,EAAQ,CAEZpX,IAAG6B,OAAOxB,MACNyW,KAAM,SAASO,EAAWC,GAgBtB,MAfc,KAAVF,GACIC,GACAJ,EAAiB/T,KAAKmU,GAEtBC,GACAJ,EAAiBhU,KAAKoU,IAGrBF,KAAU,EACfE,GAAaA,EAAUrH,MAAM,KAAM+G,GAE9BK,GACLA,EAAUpH,MAAM,KAAM8G,GAGnB1W,MAGXkX,KAAM,SAASlI,GAQX,MAPc,KAAV+H,EACAD,EAAcjU,KAAKmM,GAGnBA,EAASY,MAAM,KAAsB9L,SAAhB6S,EAA4BD,EAAcC,GAG5D3W,MAGXyL,QAAS,WAgBL,MAfAsL,GAAQ,EACRL,EAAc5O,UAEV8O,EAAiBlR,QACjB/F,GAAG+C,KAAKkU,EAAkB,SAASjU,EAAKqM,GACpCA,EAASY,MAAM,KAAM8G,KAIzBI,EAAcpR,QACd/F,GAAG+C,KAAKoU,EAAe,SAASnU,EAAKqM,GACjCA,EAASY,MAAM,KAAM8G,KAItB1W,MAGX2L,QAAS,WAgBL,MAfAoL,IAAQ,EACRJ,EAAc7O,UAEV+O,EAAiBnR,QACjB/F,GAAG+C,KAAKmU,EAAkB,SAASlU,EAAKqM,GACpCA,EAASY,MAAM,KAAM+G,KAIzBG,EAAcpR,QACd/F,GAAG+C,KAAKoU,EAAe,SAASnU,EAAKqM,GACjCA,EAASY,MAAM,KAAM+G,KAItB3W,SClFnBL,GAAGwX,YAAc,SAASC,GACtB,YAoBA,SAASC,GAAmBC,EAAOC,GAE/B,GAAIC,GAAe5P,MAAMvB,UAAUwB,MAAMtB,KAAK+Q,EAE9CG,GAAQC,UAAUC,QAAQ,WAAaL,EAAM5R,OAAS,mBACtD6R,EAAeK,cAAa,GAC5BH,EAAQC,UAAUG,+BAA+BL,EAAcD,EAAeO,cAGlF,QAASC,GAAiBC,GACtB,GAAIC,GAAoB,GAAItY,IAAG4L,OAwC/B,OAtCIyM,GAAM9P,OACN8P,EAAME,KAAK,SAASA,GAChBA,EAAKC,OAASC,EAAqBJ,GACnCK,EAAaxV,KAAKqV,GAClBD,EAAkBxM,WAEtB,SAAS6M,GACLb,EAAQC,UAAUC,QAAQ,oBAAsBK,EAAMO,SAAW,sBAAwBD,EAAUE,KAAO,IAAK,SAC/GP,EAAkBtM,YAGjBqM,EAAMS,aACXC,EAAoBV,GAAOvB,KACvB,SAAwBkC,GACpB,GAAIC,GAAcD,EAAQjT,MAE1B/F,IAAG+C,KAAKiW,EAAS,SAAShW,EAAKqV,GAC3BD,EAAiBC,GAAOd,KAAK,WACzB0B,GAAe,EAEK,IAAhBA,GACAX,EAAkBxM,cAKzBkN,EAAQjT,QACTuS,EAAkBxM,WAI1B,SAAqB6M,GACjBb,EAAQC,UAAUC,QAAQ,oBAAsBK,EAAMO,SAAW,sBAAwBD,EAAUE,KAAO,IAAK,SAC/GP,EAAkBtM,YAKvBsM,EAGX,QAASG,GAAqBJ,GAC1B,GAAItW,GAAOsW,EAAMtW,KACb6W,EAAWP,EAAMO,SACjBM,EAAwBN,EAAS/G,YAAY9P,EAUjD,OAPA6W,GAAWA,EAAS9G,OAAO,EAAGoH,GAGH,MAAvBN,EAASjJ,OAAO,KAChBiJ,EAAWA,EAAS9G,OAAO,IAGxB8G,EAIX,QAASG,GAAoBV,EAAOc,EAAQC,EAAcC,GACtD,GAAI1N,GAAU0N,GAAmB,GAAIrZ,IAAG4L,QACpC0N,EAAYH,GAAUd,EAAMkB,cAmBhC,OAjBAD,GAAUE,YACN,SAAqBR,GACjB,GAAIS,GAAaL,EAAeA,EAAapJ,OAAOgJ,GAAWA,CAE3DA,GAAQjT,OACR2T,WAAW,WACPX,EAAoBV,EAAOiB,EAAWG,EAAY9N,IACnD,GAGHA,EAAQG,QAAQ2N,IAIxB9N,EAAQK,SAGLL,EAGX,QAASgO,GAAmBtP,EAAcuN,GACtC,GAAIgC,MACAC,EAA4B,GAAI7Z,IAAG4L,OA4CvC,OA1CAkM,GAAQC,UAAU+B,yBAClBlC,EAAeK,cAAa,GAExB5N,EAAasN,MAAM5R,OAAS,IAAM+R,EAAQiC,oBAC1CjC,EAAQC,UAAUG,mCAClBJ,EAAQC,UAAUiC,UAAU,oBAAqB,IACjDpC,EAAeK,cAAa,GAC5B4B,EAA0B7N,YAG1B0M,KAEI1Y,GAAGoK,sBAAsBC,GACzBrK,GAAG+C,KAAKsH,EAAaC,MAAO,SAAStH,EAAKsE,GACtC,GAAI+Q,GAAQ/Q,EAAKiD,kBAEb8N,KAEIA,EAAM9P,OACNmQ,EAAaxV,KAAKoE,EAAK2S,aAIvBL,EAAsB1W,KAAKkV,EAAiBC,GAAOd,KAAK,WACpDqC,EAAsBM,MACe,IAAjCN,EAAsB7T,QACtB8T,EAA0B/N,gBAQ9C4M,EAAerO,EAAasN,MAGK,IAAjCiC,EAAsB7T,QACtB8T,EAA0B/N,WAI3B+N,EAGX,QAASM,GAAcC,GACnB,GAAIC,GAAW,GAAIra,IAAGsa,gBAClBC,sBAlKoB,eAmKpBta,QAASma,EACTI,QAAS,SAAS1L,GACd9O,GAAGoa,GAAU/X,SAASyV,EAAQ2C,QAAQC,YACtC5L,EAAE6L,mBAENC,sBAAuB,SAAS9L,GAC5B9O,GAAGoa,GAAU9X,YAAYwV,EAAQ2C,QAAQC,aAE7CG,OAAQ,SAAS/L,GACb6K,EAAmB7K,EAAEzE,aAAcgQ,GAAUvD,KACzC,WACIY,EAAmBgB,EAAc2B,IAErC,WACIvC,EAAQC,UAAUC,QAAQ,sEAAuE,aAcjH,OARA8C,GAAevI,YAAY,WACvB8H,EAASjI,YAGbpS,GAAGoa,GAAUtW,aA1LY,qBA0L4B9D,GAAGoa,GAAUla,OAElE6a,EAAgB7X,KAAKmX,GAEdA,EAGX,QAASW,GAAWC,GAChB,GAAIC,EASJ,OAPAlb,IAAG+C,KAAKkY,EAAU5Q,aAAa8Q,MAAO,SAAS1L,EAAKxM,GAChD,GAAY,UAARA,EAEA,MADAiY,IAAW,GACJ,IAIRA,EAWX,QAASE,GAAmBtM,GACxB,MAAI9O,IAAG6N,SACIiB,EAAEuM,EAAI,GAAKvM,EAAEwM,EAAI,EAGb,IAARxM,EAAEuM,GAAmB,IAARvM,EAAEwM,EAG1B,QAASC,KACL,GAAIC,GAAY1D,EAAQ2D,iBAEpBC,EAAqB,WACjBhC,WAAW,WACP1Z,GAAG+C,KAAKyY,EAAW,SAASxY,EAAKqX,GAC7Bra,GAAGqa,GAAUvW,aApOJ,qBAoO4C9D,GAAGqa,GAAUna,OAClEF,GAAGqa,GAAU/X,YAAYwV,EAAQ2C,QAAQC,eAE9C,IAGX1a,IAAG+C,KAAKyY,EAAW,SAASxY,EAAKqX,GAC7B,GAAIzC,GAAiBuC,EAAcE,EAG/BmB,GAAUzV,QAAU/F,GAAG8S,kBAAkB6C,UACzCmF,EAAexa,OAAOqJ,SAAU,YAAa,SAASmF,IAC7C8I,EAAeK,gBAAkB+C,EAAWlM,IAC7C9O,GAAG+C,KAAKyY,EAAW,SAASxY,EAAKqX,GAGzBA,YAAoBsB,cACpB3b,GAAGqa,GAAUvW,aArPZ,qBAuPD9D,GAAGqa,GAAU/Y,KAAKlB,QAAS,gBAQnD0a,EAAexa,OAAOqJ,SAAU,YAAa,SAASmF,GAC9CsM,EAAmBtM,IACnB4M,MAORZ,EAAexa,OAAON,GAAG2J,UAAUvG,WAAW,GAAI,aAAc,SAAS0L,GACrE4M,MAGJZ,EAAexa,OAAOqJ,SAAU,OAAQ,SAASmF,GACzCkM,EAAWlM,KACXA,EAAED,iBACF6M,OAIRZ,EAAexa,OAAOqJ,SApRE,eAoR+B+R,GArR3D,GAAI5D,GAGAiD,KACArC,KACAoC,EAAiB,GAAI9a,IAAGkS,cAE5B4F,IACI2D,oBACA1B,oBAAoB,EACpBU,SACIC,WAAY,MAEhB3C,UAAW,GAAI/X,IAAGwX,YAAYO,WAGlC/X,GAAG6B,OAAOiW,EAASL,GAAG,GAwQtB8D,IAEAvb,GAAG6B,OAAOxB,MACNub,mBAAoB,SAAS3b,GACzB6X,EAAQ2D,iBAAiBvY,KAAKjD,GAC9Bka,EAAcla,IAGlB4b,eAAgB,SAAS5b,GACrB,GAAIyQ,GACAoL,EAAMhE,EAAQ2D,gBAElB,KAAK/K,IAAKoL,GACN,GAAIA,EAAIpL,KAAOzQ,EACX,MAAO6b,GAAIC,OAAOrL,EAAG,IAKjC0B,QAAS,WACL0I,EAAe1I,UACfpS,GAAG+C,KAAKgY,EAAiB,SAAS/X,EAAKqX,GACnCA,EAASjI,eAKrB/R,KAAK2b,YACL3b,KAAK2b,SAASvD,qBAAuBA,GAGzCzY,GAAGwX,YAAYO,UAAY,WACvB,YAEA,QACI+B,uBAAwB,aACxB5B,+BAAgC,SAASP,EAAOsE,KAChDjC,UAAW,SAASnB,EAAMqD,GACtBlc,GAAGmG,IAAI,2BAA6B0S,EAAO,2BAA6BqD,EAAiB,IAAK,UAElGlE,QAAS,SAAS5R,EAASC,GACvBrG,GAAGmG,IAAIC,EAASC,MAK5BrG,GAAGsa,eAAiB,SAAS7C,GACzB,YAiBA,SAAS0E,KACL,MAAOnc,IAAG6N,UAAa7N,GAAGiO,WAAajO,GAAGkO,UAG9C,QAASkO,GAAmBtN,GAEnBuN,IAGGF,EACArB,EAAexa,OAAOqJ,SAAU,WAAY,SAASmF,GACjDA,EAAED,mBAGNiM,EAAexa,OAAOqJ,SAAU,WAAY,SAASmF,GAC7CA,EAAEzE,eACFyE,EAAEzE,aAAaiS,WAAa,OAC5BxN,EAAED,oBAKdwN,GAAsB,GAI9B,QAASE,GAAgBzN,GAGrB,IAAK9O,GAAG8S,kBAAkB6C,SACtB,OAAO,CAGX,IAAI6G,GAAYC,EAAK3N,EAAEzE,aAEvBqS,EAAW1c,GAAG6N,QAOd,OADA2O,MAAaxc,GAAGqN,OAAQrN,GAAG8S,kBAAkB6C,WAAuC,SAArB8G,EAAGE,cAC3DF,GAAMD,IAEAC,EAAG9E,OAAS8E,EAAG9E,MAAM5R,SACpB2W,GAAYD,EAAGtB,MAAMra,UAAY2b,EAAGtB,MAAMra,SAAS,UACpD2b,EAAGtB,MAAMyB,UAAYH,EAAGtB,MAAMyB,SAAS,UAIxD,QAASC,GAAoBC,GAIzB,MAHmB3Y,UAAf2Y,IACAC,EAAcD,GAEXC,EAGX,QAASC,KAGL,QAASC,KACLC,EAAiBvT,SAASwT,YAAY,SACtCD,EAAeE,UAAUtF,EAAQyC,uBAAuB,GAAM,GAJlE,GAAI2C,EAOJ,IAAIhY,OAAOmY,YACP,IACIH,EAAiB,GAAIG,aAAYvF,EAAQyC,uBAE7C,MAAO+C,GACHL,QAIJA,IAGJtT,UAAS4T,cAAcL,GAG3B,QAASM,KACL1C,EAAexa,OAAOL,EAAS,WAAY,SAAS6O,GAChD,GAAKyN,EAAgBzN,GAArB,CAMA,GAAI2O,GAASzd,GAAGqN,MAAQrN,GAAG8S,kBAAkB6C,SAAW,KAAO7G,EAAEzE,aAAasS,aAE1E7N,GAAEzE,aAAaiS,WADJ,SAAXmB,GAAgC,aAAXA,EACO,OAEA,OAGhC3O,EAAE6L,kBACF7L,EAAED,oBAGNiM,EAAexa,OAAOL,EAAS,YAAa,SAAS6O,GACjD,IAAK+N,IAAuB,CACxB,IAAKN,EAAgBzN,GACjB,MAEJgJ,GAAQ0C,QAAQ1L,MAIxBgM,EAAexa,OAAOL,EAAS,YAAa,SAAS6O,GACjD,GAAKyN,EAAgBzN,GAArB,CAIAgJ,EAAQ4F,QAAQ5O,EAEhB,IAAI6O,GAAgBhU,SAASiU,iBAAiB9O,EAAE+O,QAAS/O,EAAEgP,QAEvD9d,IAAGK,MAAMS,SAAS6c,IAItB7F,EAAQ8C,sBAAsB9L,MAGlCgM,EAAexa,OAAOL,EAAS,OAAQ,SAAS6O,GAC5C,IAAK+N,IAAuB,CACxB,IAAKN,EAAgBzN,GACjB,MAGJA,GAAED,iBACFC,EAAE6L,kBACF7C,EAAQ+C,OAAO/L,GAEfkO,OArJZ,GACIlF,GAAS7X,EAAS8c,EAAaV,EAD/BvB,EAAiB,GAAI9a,IAAGkS,cAG5B4F,IACI7X,QAAS,KACTua,QAAS,SAAS1L,KAClB4O,QAAS,SAAS5O,KAElB8L,sBAAuB,SAAS9L,KAChC+L,OAAQ,SAAS/L,MAGrB9O,GAAG6B,OAAOiW,EAASL,GACnBxX,EAAU6X,EAAQ7X,QA6IlBmc,IACAoB,IAEAxd,GAAG6B,OAAOxB,MACN4X,aAAc,SAAS6E,GACnB,MAAOD,GAAoBC,IAG/B1K,QAAS,WACL0I,EAAe1I,WAGnB+F,WAAY,WACR,MAAOlY,MAIfI,KAAK2b,YACL3b,KAAK2b,SAASO,gBAAkBA,INzfLrX","file":"dnd.min.js","sourcesContent":[null,"/*globals window, navigator, document, FormData, File, HTMLInputElement, XMLHttpRequest, Blob, Storage, ActiveXObject */\n/* jshint -W079 */\nvar qq = function(element) {\n \"use strict\";\n\n return {\n hide: function() {\n element.style.display = \"none\";\n return this;\n },\n\n /** Returns the function which detaches attached event */\n attach: function(type, fn) {\n if (element.addEventListener) {\n element.addEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.attachEvent(\"on\" + type, fn);\n }\n return function() {\n qq(element).detach(type, fn);\n };\n },\n\n detach: function(type, fn) {\n if (element.removeEventListener) {\n element.removeEventListener(type, fn, false);\n } else if (element.attachEvent) {\n element.detachEvent(\"on\" + type, fn);\n }\n return this;\n },\n\n contains: function(descendant) {\n // The [W3C spec](http://www.w3.org/TR/domcore/#dom-node-contains)\n // says a `null` (or ostensibly `undefined`) parameter\n // passed into `Node.contains` should result in a false return value.\n // IE7 throws an exception if the parameter is `undefined` though.\n if (!descendant) {\n return false;\n }\n\n // compareposition returns false in this case\n if (element === descendant) {\n return true;\n }\n\n if (element.contains) {\n return element.contains(descendant);\n } else {\n /*jslint bitwise: true*/\n return !!(descendant.compareDocumentPosition(element) & 8);\n }\n },\n\n /**\n * Insert this element before elementB.\n */\n insertBefore: function(elementB) {\n elementB.parentNode.insertBefore(element, elementB);\n return this;\n },\n\n remove: function() {\n element.parentNode.removeChild(element);\n return this;\n },\n\n /**\n * Sets styles for an element.\n * Fixes opacity in IE6-8.\n */\n css: function(styles) {\n /*jshint eqnull: true*/\n if (element.style == null) {\n throw new qq.Error(\"Can't apply style to node as it is not on the HTMLElement prototype chain!\");\n }\n\n /*jshint -W116*/\n if (styles.opacity != null) {\n if (typeof element.style.opacity !== \"string\" && typeof (element.filters) !== \"undefined\") {\n styles.filter = \"alpha(opacity=\" + Math.round(100 * styles.opacity) + \")\";\n }\n }\n qq.extend(element.style, styles);\n\n return this;\n },\n\n hasClass: function(name, considerParent) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className));\n },\n\n addClass: function(name) {\n if (!qq(element).hasClass(name)) {\n element.className += \" \" + name;\n }\n return this;\n },\n\n removeClass: function(name) {\n var re = new RegExp(\"(^| )\" + name + \"( |$)\");\n element.className = element.className.replace(re, \" \").replace(/^\\s+|\\s+$/g, \"\");\n return this;\n },\n\n getByClass: function(className, first) {\n var candidates,\n result = [];\n\n if (first && element.querySelector) {\n return element.querySelector(\".\" + className);\n }\n else if (element.querySelectorAll) {\n return element.querySelectorAll(\".\" + className);\n }\n\n candidates = element.getElementsByTagName(\"*\");\n\n qq.each(candidates, function(idx, val) {\n if (qq(val).hasClass(className)) {\n result.push(val);\n }\n });\n return first ? result[0] : result;\n },\n\n getFirstByClass: function(className) {\n return qq(element).getByClass(className, true);\n },\n\n children: function() {\n var children = [],\n child = element.firstChild;\n\n while (child) {\n if (child.nodeType === 1) {\n children.push(child);\n }\n child = child.nextSibling;\n }\n\n return children;\n },\n\n setText: function(text) {\n element.innerText = text;\n element.textContent = text;\n return this;\n },\n\n clearText: function() {\n return qq(element).setText(\"\");\n },\n\n // Returns true if the attribute exists on the element\n // AND the value of the attribute is NOT \"false\" (case-insensitive)\n hasAttribute: function(attrName) {\n var attrVal;\n\n if (element.hasAttribute) {\n\n if (!element.hasAttribute(attrName)) {\n return false;\n }\n\n /*jshint -W116*/\n return (/^false$/i).exec(element.getAttribute(attrName)) == null;\n }\n else {\n attrVal = element[attrName];\n\n if (attrVal === undefined) {\n return false;\n }\n\n /*jshint -W116*/\n return (/^false$/i).exec(attrVal) == null;\n }\n }\n };\n};\n\n(function() {\n \"use strict\";\n\n qq.canvasToBlob = function(canvas, mime, quality) {\n return qq.dataUriToBlob(canvas.toDataURL(mime, quality));\n };\n\n qq.dataUriToBlob = function(dataUri) {\n var arrayBuffer, byteString,\n createBlob = function(data, mime) {\n var BlobBuilder = window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder,\n blobBuilder = BlobBuilder && new BlobBuilder();\n\n if (blobBuilder) {\n blobBuilder.append(data);\n return blobBuilder.getBlob(mime);\n }\n else {\n return new Blob([data], {type: mime});\n }\n },\n intArray, mimeString;\n\n // convert base64 to raw binary data held in a string\n if (dataUri.split(\",\")[0].indexOf(\"base64\") >= 0) {\n byteString = atob(dataUri.split(\",\")[1]);\n }\n else {\n byteString = decodeURI(dataUri.split(\",\")[1]);\n }\n\n // extract the MIME\n mimeString = dataUri.split(\",\")[0]\n .split(\":\")[1]\n .split(\";\")[0];\n\n // write the bytes of the binary string to an ArrayBuffer\n arrayBuffer = new ArrayBuffer(byteString.length);\n intArray = new Uint8Array(arrayBuffer);\n qq.each(byteString, function(idx, character) {\n intArray[idx] = character.charCodeAt(0);\n });\n\n return createBlob(arrayBuffer, mimeString);\n };\n\n qq.log = function(message, level) {\n if (window.console) {\n if (!level || level === \"info\") {\n window.console.log(message);\n }\n else\n {\n if (window.console[level]) {\n window.console[level](message);\n }\n else {\n window.console.log(\"<\" + level + \"> \" + message);\n }\n }\n }\n };\n\n qq.isObject = function(variable) {\n return variable && !variable.nodeType && Object.prototype.toString.call(variable) === \"[object Object]\";\n };\n\n qq.isFunction = function(variable) {\n return typeof (variable) === \"function\";\n };\n\n /**\n * Check the type of a value. Is it an \"array\"?\n *\n * @param value value to test.\n * @returns true if the value is an array or associated with an `ArrayBuffer`\n */\n qq.isArray = function(value) {\n return Object.prototype.toString.call(value) === \"[object Array]\" ||\n (value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer);\n };\n\n // Looks for an object on a `DataTransfer` object that is associated with drop events when utilizing the Filesystem API.\n qq.isItemList = function(maybeItemList) {\n return Object.prototype.toString.call(maybeItemList) === \"[object DataTransferItemList]\";\n };\n\n // Looks for an object on a `NodeList` or an `HTMLCollection`|`HTMLFormElement`|`HTMLSelectElement`\n // object that is associated with collections of Nodes.\n qq.isNodeList = function(maybeNodeList) {\n return Object.prototype.toString.call(maybeNodeList) === \"[object NodeList]\" ||\n // If `HTMLCollection` is the actual type of the object, we must determine this\n // by checking for expected properties/methods on the object\n (maybeNodeList.item && maybeNodeList.namedItem);\n };\n\n qq.isString = function(maybeString) {\n return Object.prototype.toString.call(maybeString) === \"[object String]\";\n };\n\n qq.trimStr = function(string) {\n if (String.prototype.trim) {\n return string.trim();\n }\n\n return string.replace(/^\\s+|\\s+$/g, \"\");\n };\n\n /**\n * @param str String to format.\n * @returns {string} A string, swapping argument values with the associated occurrence of {} in the passed string.\n */\n qq.format = function(str) {\n\n var args = Array.prototype.slice.call(arguments, 1),\n newStr = str,\n nextIdxToReplace = newStr.indexOf(\"{}\");\n\n qq.each(args, function(idx, val) {\n var strBefore = newStr.substring(0, nextIdxToReplace),\n strAfter = newStr.substring(nextIdxToReplace + 2);\n\n newStr = strBefore + val + strAfter;\n nextIdxToReplace = newStr.indexOf(\"{}\", nextIdxToReplace + val.length);\n\n // End the loop if we have run out of tokens (when the arguments exceed the # of tokens)\n if (nextIdxToReplace < 0) {\n return false;\n }\n });\n\n return newStr;\n };\n\n qq.isFile = function(maybeFile) {\n return window.File && Object.prototype.toString.call(maybeFile) === \"[object File]\";\n };\n\n qq.isFileList = function(maybeFileList) {\n return window.FileList && Object.prototype.toString.call(maybeFileList) === \"[object FileList]\";\n };\n\n qq.isFileOrInput = function(maybeFileOrInput) {\n return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput);\n };\n\n qq.isInput = function(maybeInput, notFile) {\n var evaluateType = function(type) {\n var normalizedType = type.toLowerCase();\n\n if (notFile) {\n return normalizedType !== \"file\";\n }\n\n return normalizedType === \"file\";\n };\n\n if (window.HTMLInputElement) {\n if (Object.prototype.toString.call(maybeInput) === \"[object HTMLInputElement]\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n if (maybeInput.tagName) {\n if (maybeInput.tagName.toLowerCase() === \"input\") {\n if (maybeInput.type && evaluateType(maybeInput.type)) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n qq.isBlob = function(maybeBlob) {\n if (window.Blob && Object.prototype.toString.call(maybeBlob) === \"[object Blob]\") {\n return true;\n }\n };\n\n qq.isXhrUploadSupported = function() {\n var input = document.createElement(\"input\");\n input.type = \"file\";\n\n return (\n input.multiple !== undefined &&\n typeof File !== \"undefined\" &&\n typeof FormData !== \"undefined\" &&\n typeof (qq.createXhrInstance()).upload !== \"undefined\");\n };\n\n // Fall back to ActiveX is native XHR is disabled (possible in any version of IE).\n qq.createXhrInstance = function() {\n if (window.XMLHttpRequest) {\n return new XMLHttpRequest();\n }\n\n try {\n return new ActiveXObject(\"MSXML2.XMLHTTP.3.0\");\n }\n catch (error) {\n qq.log(\"Neither XHR or ActiveX are supported!\", \"error\");\n return null;\n }\n };\n\n qq.isFolderDropSupported = function(dataTransfer) {\n return dataTransfer.items &&\n dataTransfer.items.length > 0 &&\n dataTransfer.items[0].webkitGetAsEntry;\n };\n\n qq.isFileChunkingSupported = function() {\n return !qq.androidStock() && //Android's stock browser cannot upload Blobs correctly\n qq.isXhrUploadSupported() &&\n (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined);\n };\n\n qq.sliceBlob = function(fileOrBlob, start, end) {\n var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice;\n\n return slicer.call(fileOrBlob, start, end);\n };\n\n qq.arrayBufferToHex = function(buffer) {\n var bytesAsHex = \"\",\n bytes = new Uint8Array(buffer);\n\n qq.each(bytes, function(idx, byt) {\n var byteAsHexStr = byt.toString(16);\n\n if (byteAsHexStr.length < 2) {\n byteAsHexStr = \"0\" + byteAsHexStr;\n }\n\n bytesAsHex += byteAsHexStr;\n });\n\n return bytesAsHex;\n };\n\n qq.readBlobToHex = function(blob, startOffset, length) {\n var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length),\n fileReader = new FileReader(),\n promise = new qq.Promise();\n\n fileReader.onload = function() {\n promise.success(qq.arrayBufferToHex(fileReader.result));\n };\n\n fileReader.onerror = promise.failure;\n\n fileReader.readAsArrayBuffer(initialBlob);\n\n return promise;\n };\n\n qq.extend = function(first, second, extendNested) {\n qq.each(second, function(prop, val) {\n if (extendNested && qq.isObject(val)) {\n if (first[prop] === undefined) {\n first[prop] = {};\n }\n qq.extend(first[prop], val, true);\n }\n else {\n first[prop] = val;\n }\n });\n\n return first;\n };\n\n /**\n * Allow properties in one object to override properties in another,\n * keeping track of the original values from the target object.\n *\n * Note that the pre-overriden properties to be overriden by the source will be passed into the `sourceFn` when it is invoked.\n *\n * @param target Update properties in this object from some source\n * @param sourceFn A function that, when invoked, will return properties that will replace properties with the same name in the target.\n * @returns {object} The target object\n */\n qq.override = function(target, sourceFn) {\n var super_ = {},\n source = sourceFn(super_);\n\n qq.each(source, function(srcPropName, srcPropVal) {\n if (target[srcPropName] !== undefined) {\n super_[srcPropName] = target[srcPropName];\n }\n\n target[srcPropName] = srcPropVal;\n });\n\n return target;\n };\n\n /**\n * Searches for a given element (elt) in the array, returns -1 if it is not present.\n */\n qq.indexOf = function(arr, elt, from) {\n if (arr.indexOf) {\n return arr.indexOf(elt, from);\n }\n\n from = from || 0;\n var len = arr.length;\n\n if (from < 0) {\n from += len;\n }\n\n for (; from < len; from += 1) {\n if (arr.hasOwnProperty(from) && arr[from] === elt) {\n return from;\n }\n }\n return -1;\n };\n\n //this is a version 4 UUID\n qq.getUniqueId = function() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n /*jslint eqeq: true, bitwise: true*/\n var r = Math.random() * 16 | 0, v = c == \"x\" ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n };\n\n //\n // Browsers and platforms detection\n qq.ie = function() {\n return navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n navigator.userAgent.indexOf(\"Trident\") !== -1;\n };\n\n qq.ie7 = function() {\n return navigator.userAgent.indexOf(\"MSIE 7\") !== -1;\n };\n\n qq.ie8 = function() {\n return navigator.userAgent.indexOf(\"MSIE 8\") !== -1;\n };\n\n qq.ie10 = function() {\n return navigator.userAgent.indexOf(\"MSIE 10\") !== -1;\n };\n\n qq.ie11 = function() {\n return qq.ie() && navigator.userAgent.indexOf(\"rv:11\") !== -1;\n };\n\n qq.edge = function() {\n return navigator.userAgent.indexOf(\"Edge\") >= 0;\n };\n\n qq.safari = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Apple\") !== -1;\n };\n\n qq.chrome = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Google\") !== -1;\n };\n\n qq.opera = function() {\n return navigator.vendor !== undefined && navigator.vendor.indexOf(\"Opera\") !== -1;\n };\n\n qq.firefox = function() {\n return (!qq.edge() && !qq.ie11() && navigator.userAgent.indexOf(\"Mozilla\") !== -1 && navigator.vendor !== undefined && navigator.vendor === \"\");\n };\n\n qq.windows = function() {\n return navigator.platform === \"Win32\";\n };\n\n qq.android = function() {\n return navigator.userAgent.toLowerCase().indexOf(\"android\") !== -1;\n };\n\n // We need to identify the Android stock browser via the UA string to work around various bugs in this browser,\n // such as the one that prevents a `Blob` from being uploaded.\n qq.androidStock = function() {\n return qq.android() && navigator.userAgent.toLowerCase().indexOf(\"chrome\") < 0;\n };\n\n qq.ios6 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 6_\") !== -1;\n };\n\n qq.ios7 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 7_\") !== -1;\n };\n\n qq.ios8 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_\") !== -1;\n };\n\n // iOS 8.0.0\n qq.ios800 = function() {\n return qq.ios() && navigator.userAgent.indexOf(\" OS 8_0 \") !== -1;\n };\n\n qq.ios = function() {\n /*jshint -W014 */\n return navigator.userAgent.indexOf(\"iPad\") !== -1\n || navigator.userAgent.indexOf(\"iPod\") !== -1\n || navigator.userAgent.indexOf(\"iPhone\") !== -1;\n };\n\n qq.iosChrome = function() {\n return qq.ios() && navigator.userAgent.indexOf(\"CriOS\") !== -1;\n };\n\n qq.iosSafari = function() {\n return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf(\"Safari\") !== -1;\n };\n\n qq.iosSafariWebView = function() {\n return qq.ios() && !qq.iosChrome() && !qq.iosSafari();\n };\n\n //\n // Events\n\n qq.preventDefault = function(e) {\n if (e.preventDefault) {\n e.preventDefault();\n } else {\n e.returnValue = false;\n }\n };\n\n /**\n * Creates and returns element from html string\n * Uses innerHTML to create an element\n */\n qq.toElement = (function() {\n var div = document.createElement(\"div\");\n return function(html) {\n div.innerHTML = html;\n var element = div.firstChild;\n div.removeChild(element);\n return element;\n };\n }());\n\n //key and value are passed to callback for each entry in the iterable item\n qq.each = function(iterableItem, callback) {\n var keyOrIndex, retVal;\n\n if (iterableItem) {\n // Iterate through [`Storage`](http://www.w3.org/TR/webstorage/#the-storage-interface) items\n if (window.Storage && iterableItem.constructor === window.Storage) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex)));\n if (retVal === false) {\n break;\n }\n }\n }\n // `DataTransferItemList` & `NodeList` objects are array-like and should be treated as arrays\n // when iterating over items inside the object.\n else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n }\n else if (qq.isString(iterableItem)) {\n for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) {\n retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex));\n if (retVal === false) {\n break;\n }\n }\n }\n else {\n for (keyOrIndex in iterableItem) {\n if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) {\n retVal = callback(keyOrIndex, iterableItem[keyOrIndex]);\n if (retVal === false) {\n break;\n }\n }\n }\n }\n }\n };\n\n //include any args that should be passed to the new function after the context arg\n qq.bind = function(oldFunc, context) {\n if (qq.isFunction(oldFunc)) {\n var args = Array.prototype.slice.call(arguments, 2);\n\n return function() {\n var newArgs = qq.extend([], args);\n if (arguments.length) {\n newArgs = newArgs.concat(Array.prototype.slice.call(arguments));\n }\n return oldFunc.apply(context, newArgs);\n };\n }\n\n throw new Error(\"first parameter must be a function!\");\n };\n\n /**\n * obj2url() takes a json-object as argument and generates\n * a querystring. pretty much like jQuery.param()\n *\n * how to use:\n *\n * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`\n *\n * will result in:\n *\n * `http://any.url/upload?otherParam=value&a=b&c=d`\n *\n * @param Object JSON-Object\n * @param String current querystring-part\n * @return String encoded querystring\n */\n qq.obj2url = function(obj, temp, prefixDone) {\n /*jshint laxbreak: true*/\n var uristrings = [],\n prefix = \"&\",\n add = function(nextObj, i) {\n var nextTemp = temp\n ? (/\\[\\]$/.test(temp)) // prevent double-encoding\n ? temp\n : temp + \"[\" + i + \"]\"\n : i;\n if ((nextTemp !== \"undefined\") && (i !== \"undefined\")) {\n uristrings.push(\n (typeof nextObj === \"object\")\n ? qq.obj2url(nextObj, nextTemp, true)\n : (Object.prototype.toString.call(nextObj) === \"[object Function]\")\n ? encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj())\n : encodeURIComponent(nextTemp) + \"=\" + encodeURIComponent(nextObj)\n );\n }\n };\n\n if (!prefixDone && temp) {\n prefix = (/\\?/.test(temp)) ? (/\\?$/.test(temp)) ? \"\" : \"&\" : \"?\";\n uristrings.push(temp);\n uristrings.push(qq.obj2url(obj));\n } else if ((Object.prototype.toString.call(obj) === \"[object Array]\") && (typeof obj !== \"undefined\")) {\n qq.each(obj, function(idx, val) {\n add(val, idx);\n });\n } else if ((typeof obj !== \"undefined\") && (obj !== null) && (typeof obj === \"object\")) {\n qq.each(obj, function(prop, val) {\n add(val, prop);\n });\n } else {\n uristrings.push(encodeURIComponent(temp) + \"=\" + encodeURIComponent(obj));\n }\n\n if (temp) {\n return uristrings.join(prefix);\n } else {\n return uristrings.join(prefix)\n .replace(/^&/, \"\")\n .replace(/%20/g, \"+\");\n }\n };\n\n qq.obj2FormData = function(obj, formData, arrayKeyName) {\n if (!formData) {\n formData = new FormData();\n }\n\n qq.each(obj, function(key, val) {\n key = arrayKeyName ? arrayKeyName + \"[\" + key + \"]\" : key;\n\n if (qq.isObject(val)) {\n qq.obj2FormData(val, formData, key);\n }\n else if (qq.isFunction(val)) {\n formData.append(key, val());\n }\n else {\n formData.append(key, val);\n }\n });\n\n return formData;\n };\n\n qq.obj2Inputs = function(obj, form) {\n var input;\n\n if (!form) {\n form = document.createElement(\"form\");\n }\n\n qq.obj2FormData(obj, {\n append: function(key, val) {\n input = document.createElement(\"input\");\n input.setAttribute(\"name\", key);\n input.setAttribute(\"value\", val);\n form.appendChild(input);\n }\n });\n\n return form;\n };\n\n /**\n * Not recommended for use outside of Fine Uploader since this falls back to an unchecked eval if JSON.parse is not\n * implemented. For a more secure JSON.parse polyfill, use Douglas Crockford's json2.js.\n */\n qq.parseJson = function(json) {\n /*jshint evil: true*/\n if (window.JSON && qq.isFunction(JSON.parse)) {\n return JSON.parse(json);\n } else {\n return eval(\"(\" + json + \")\");\n }\n };\n\n /**\n * Retrieve the extension of a file, if it exists.\n *\n * @param filename\n * @returns {string || undefined}\n */\n qq.getExtension = function(filename) {\n var extIdx = filename.lastIndexOf(\".\") + 1;\n\n if (extIdx > 0) {\n return filename.substr(extIdx, filename.length - extIdx);\n }\n };\n\n qq.getFilename = function(blobOrFileInput) {\n /*jslint regexp: true*/\n\n if (qq.isInput(blobOrFileInput)) {\n // get input value and remove path to normalize\n return blobOrFileInput.value.replace(/.*(\\/|\\\\)/, \"\");\n }\n else if (qq.isFile(blobOrFileInput)) {\n if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) {\n return blobOrFileInput.fileName;\n }\n }\n\n return blobOrFileInput.name;\n };\n\n /**\n * A generic module which supports object disposing in dispose() method.\n * */\n qq.DisposeSupport = function() {\n var disposers = [];\n\n return {\n /** Run all registered disposers */\n dispose: function() {\n var disposer;\n do {\n disposer = disposers.shift();\n if (disposer) {\n disposer();\n }\n }\n while (disposer);\n },\n\n /** Attach event handler and register de-attacher as a disposer */\n attach: function() {\n var args = arguments;\n /*jslint undef:true*/\n this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1)));\n },\n\n /** Add disposer to the collection */\n addDisposer: function(disposeFunction) {\n disposers.push(disposeFunction);\n }\n };\n };\n}());\n","/* globals define, module, global, qq */\n(function() {\n \"use strict\";\n if (typeof define === \"function\" && define.amd) {\n define(function() {\n return qq;\n });\n }\n else if (typeof module !== \"undefined\" && module.exports) {\n module.exports = qq;\n }\n else {\n global.qq = qq;\n }\n}());\n","/*global qq */\nqq.version = \"5.16.2\";\n","/* globals qq */\nqq.supportedFeatures = (function() {\n \"use strict\";\n\n var supportsUploading,\n supportsUploadingBlobs,\n supportsFileDrop,\n supportsAjaxFileUploading,\n supportsFolderDrop,\n supportsChunking,\n supportsResume,\n supportsUploadViaPaste,\n supportsUploadCors,\n supportsDeleteFileXdr,\n supportsDeleteFileCorsXhr,\n supportsDeleteFileCors,\n supportsFolderSelection,\n supportsImagePreviews,\n supportsUploadProgress;\n\n function testSupportsFileInputElement() {\n var supported = true,\n tempInput;\n\n try {\n tempInput = document.createElement(\"input\");\n tempInput.type = \"file\";\n qq(tempInput).hide();\n\n if (tempInput.disabled) {\n supported = false;\n }\n }\n catch (ex) {\n supported = false;\n }\n\n return supported;\n }\n\n //only way to test for complete Clipboard API support at this time\n function isChrome14OrHigher() {\n return (qq.chrome() || qq.opera()) &&\n navigator.userAgent.match(/Chrome\\/[1][4-9]|Chrome\\/[2-9][0-9]/) !== undefined;\n }\n\n //Ensure we can send cross-origin `XMLHttpRequest`s\n function isCrossOriginXhrSupported() {\n if (window.XMLHttpRequest) {\n var xhr = qq.createXhrInstance();\n\n //Commonly accepted test for XHR CORS support.\n return xhr.withCredentials !== undefined;\n }\n\n return false;\n }\n\n //Test for (terrible) cross-origin ajax transport fallback for IE9 and IE8\n function isXdrSupported() {\n return window.XDomainRequest !== undefined;\n }\n\n // CORS Ajax requests are supported if it is either possible to send credentialed `XMLHttpRequest`s,\n // or if `XDomainRequest` is an available alternative.\n function isCrossOriginAjaxSupported() {\n if (isCrossOriginXhrSupported()) {\n return true;\n }\n\n return isXdrSupported();\n }\n\n function isFolderSelectionSupported() {\n // We know that folder selection is only supported in Chrome via this proprietary attribute for now\n return document.createElement(\"input\").webkitdirectory !== undefined;\n }\n\n function isLocalStorageSupported() {\n try {\n return !!window.localStorage &&\n // unpatched versions of IE10/11 have buggy impls of localStorage where setItem is a string\n qq.isFunction(window.localStorage.setItem);\n }\n catch (error) {\n // probably caught a security exception, so no localStorage for you\n return false;\n }\n }\n\n function isDragAndDropSupported() {\n var span = document.createElement(\"span\");\n\n return (\"draggable\" in span || (\"ondragstart\" in span && \"ondrop\" in span)) &&\n !qq.android() && !qq.ios();\n }\n\n supportsUploading = testSupportsFileInputElement();\n\n supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported();\n\n supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock();\n\n supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported();\n\n // adapted from https://stackoverflow.com/a/23278460/486979\n supportsFolderDrop = supportsFileDrop && (function() {\n var input = document.createElement(\"input\");\n\n input.type = \"file\";\n return !!(\"webkitdirectory\" in (input || document.querySelectorAll(\"input[type=file]\")[0]));\n }());\n\n supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported();\n\n supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported();\n\n supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher();\n\n supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading);\n\n supportsDeleteFileCorsXhr = isCrossOriginXhrSupported();\n\n supportsDeleteFileXdr = isXdrSupported();\n\n supportsDeleteFileCors = isCrossOriginAjaxSupported();\n\n supportsFolderSelection = isFolderSelectionSupported();\n\n supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined;\n\n supportsUploadProgress = (function() {\n if (supportsAjaxFileUploading) {\n return !qq.androidStock() && !qq.iosChrome();\n }\n return false;\n }());\n\n return {\n ajaxUploading: supportsAjaxFileUploading,\n blobUploading: supportsUploadingBlobs,\n canDetermineSize: supportsAjaxFileUploading,\n chunking: supportsChunking,\n deleteFileCors: supportsDeleteFileCors,\n deleteFileCorsXdr: supportsDeleteFileXdr, //NOTE: will also return true in IE10, where XDR is also supported\n deleteFileCorsXhr: supportsDeleteFileCorsXhr,\n dialogElement: !!window.HTMLDialogElement,\n fileDrop: supportsFileDrop,\n folderDrop: supportsFolderDrop,\n folderSelection: supportsFolderSelection,\n imagePreviews: supportsImagePreviews,\n imageValidation: supportsImagePreviews,\n itemSizeValidation: supportsAjaxFileUploading,\n pause: supportsChunking,\n progressBar: supportsUploadProgress,\n resume: supportsResume,\n scaling: supportsImagePreviews && supportsUploadingBlobs,\n tiffPreviews: qq.safari(), // Not the best solution, but simple and probably accurate enough (for now)\n unlimitedScaledImageSize: !qq.ios(), // false simply indicates that there is some known limit\n uploading: supportsUploading,\n uploadCors: supportsUploadCors,\n uploadCustomHeaders: supportsAjaxFileUploading,\n uploadNonMultipart: supportsAjaxFileUploading,\n uploadViaPaste: supportsUploadViaPaste\n };\n\n}());\n","/*globals qq*/\n\n// Is the passed object a promise instance?\nqq.isGenericPromise = function(maybePromise) {\n \"use strict\";\n return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then));\n};\n\nqq.Promise = function() {\n \"use strict\";\n\n var successArgs, failureArgs,\n successCallbacks = [],\n failureCallbacks = [],\n doneCallbacks = [],\n state = 0;\n\n qq.extend(this, {\n then: function(onSuccess, onFailure) {\n if (state === 0) {\n if (onSuccess) {\n successCallbacks.push(onSuccess);\n }\n if (onFailure) {\n failureCallbacks.push(onFailure);\n }\n }\n else if (state === -1) {\n onFailure && onFailure.apply(null, failureArgs);\n }\n else if (onSuccess) {\n onSuccess.apply(null, successArgs);\n }\n\n return this;\n },\n\n done: function(callback) {\n if (state === 0) {\n doneCallbacks.push(callback);\n }\n else {\n callback.apply(null, failureArgs === undefined ? successArgs : failureArgs);\n }\n\n return this;\n },\n\n success: function() {\n state = 1;\n successArgs = arguments;\n\n if (successCallbacks.length) {\n qq.each(successCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, successArgs);\n });\n }\n\n return this;\n },\n\n failure: function() {\n state = -1;\n failureArgs = arguments;\n\n if (failureCallbacks.length) {\n qq.each(failureCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n\n if (doneCallbacks.length) {\n qq.each(doneCallbacks, function(idx, callback) {\n callback.apply(null, failureArgs);\n });\n }\n\n return this;\n }\n });\n};\n","/*globals qq, document, CustomEvent*/\nqq.DragAndDrop = function(o) {\n \"use strict\";\n\n var options,\n HIDE_ZONES_EVENT_NAME = \"qq-hidezones\",\n HIDE_BEFORE_ENTER_ATTR = \"qq-hide-dropzone\",\n uploadDropZones = [],\n droppedFiles = [],\n disposeSupport = new qq.DisposeSupport();\n\n options = {\n dropZoneElements: [],\n allowMultipleItems: true,\n classes: {\n dropActive: null\n },\n callbacks: new qq.DragAndDrop.callbacks()\n };\n\n qq.extend(options, o, true);\n\n function uploadDroppedFiles(files, uploadDropZone) {\n // We need to convert the `FileList` to an actual `Array` to avoid iteration issues\n var filesAsArray = Array.prototype.slice.call(files);\n\n options.callbacks.dropLog(\"Grabbed \" + files.length + \" dropped files.\");\n uploadDropZone.dropDisabled(false);\n options.callbacks.processingDroppedFilesComplete(filesAsArray, uploadDropZone.getElement());\n }\n\n function traverseFileTree(entry) {\n var parseEntryPromise = new qq.Promise();\n\n if (entry.isFile) {\n entry.file(function(file) {\n file.qqPath = extractDirectoryPath(entry);\n droppedFiles.push(file);\n parseEntryPromise.success();\n },\n function(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n });\n }\n else if (entry.isDirectory) {\n getFilesInDirectory(entry).then(\n function allEntriesRead(entries) {\n var entriesLeft = entries.length;\n\n qq.each(entries, function(idx, entry) {\n traverseFileTree(entry).done(function() {\n entriesLeft -= 1;\n\n if (entriesLeft === 0) {\n parseEntryPromise.success();\n }\n });\n });\n\n if (!entries.length) {\n parseEntryPromise.success();\n }\n },\n\n function readFailure(fileError) {\n options.callbacks.dropLog(\"Problem parsing '\" + entry.fullPath + \"'. FileError code \" + fileError.code + \".\", \"error\");\n parseEntryPromise.failure();\n }\n );\n }\n\n return parseEntryPromise;\n }\n\n function extractDirectoryPath(entry) {\n var name = entry.name,\n fullPath = entry.fullPath,\n indexOfNameInFullPath = fullPath.lastIndexOf(name);\n\n // remove file name from full path string\n fullPath = fullPath.substr(0, indexOfNameInFullPath);\n\n // remove leading slash in full path string\n if (fullPath.charAt(0) === \"/\") {\n fullPath = fullPath.substr(1);\n }\n\n return fullPath;\n }\n\n // Promissory. Guaranteed to read all files in the root of the passed directory.\n function getFilesInDirectory(entry, reader, accumEntries, existingPromise) {\n var promise = existingPromise || new qq.Promise(),\n dirReader = reader || entry.createReader();\n\n dirReader.readEntries(\n function readSuccess(entries) {\n var newEntries = accumEntries ? accumEntries.concat(entries) : entries;\n\n if (entries.length) {\n setTimeout(function() { // prevent stack overflow, however unlikely\n getFilesInDirectory(entry, dirReader, newEntries, promise);\n }, 0);\n }\n else {\n promise.success(newEntries);\n }\n },\n\n promise.failure\n );\n\n return promise;\n }\n\n function handleDataTransfer(dataTransfer, uploadDropZone) {\n var pendingFolderPromises = [],\n handleDataTransferPromise = new qq.Promise();\n\n options.callbacks.processingDroppedFiles();\n uploadDropZone.dropDisabled(true);\n\n if (dataTransfer.files.length > 1 && !options.allowMultipleItems) {\n options.callbacks.processingDroppedFilesComplete([]);\n options.callbacks.dropError(\"tooManyFilesError\", \"\");\n uploadDropZone.dropDisabled(false);\n handleDataTransferPromise.failure();\n }\n else {\n droppedFiles = [];\n\n if (qq.isFolderDropSupported(dataTransfer)) {\n qq.each(dataTransfer.items, function(idx, item) {\n var entry = item.webkitGetAsEntry();\n\n if (entry) {\n //due to a bug in Chrome's File System API impl - #149735\n if (entry.isFile) {\n droppedFiles.push(item.getAsFile());\n }\n\n else {\n pendingFolderPromises.push(traverseFileTree(entry).done(function() {\n pendingFolderPromises.pop();\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }));\n }\n }\n });\n }\n else {\n droppedFiles = dataTransfer.files;\n }\n\n if (pendingFolderPromises.length === 0) {\n handleDataTransferPromise.success();\n }\n }\n\n return handleDataTransferPromise;\n }\n\n function setupDropzone(dropArea) {\n var dropZone = new qq.UploadDropZone({\n HIDE_ZONES_EVENT_NAME: HIDE_ZONES_EVENT_NAME,\n element: dropArea,\n onEnter: function(e) {\n qq(dropArea).addClass(options.classes.dropActive);\n e.stopPropagation();\n },\n onLeaveNotDescendants: function(e) {\n qq(dropArea).removeClass(options.classes.dropActive);\n },\n onDrop: function(e) {\n handleDataTransfer(e.dataTransfer, dropZone).then(\n function() {\n uploadDroppedFiles(droppedFiles, dropZone);\n },\n function() {\n options.callbacks.dropLog(\"Drop event DataTransfer parsing failed. No files will be uploaded.\", \"error\");\n }\n );\n }\n });\n\n disposeSupport.addDisposer(function() {\n dropZone.dispose();\n });\n\n qq(dropArea).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropArea).hide();\n\n uploadDropZones.push(dropZone);\n\n return dropZone;\n }\n\n function isFileDrag(dragEvent) {\n var fileDrag;\n\n qq.each(dragEvent.dataTransfer.types, function(key, val) {\n if (val === \"Files\") {\n fileDrag = true;\n return false;\n }\n });\n\n return fileDrag;\n }\n\n // Attempt to determine when the file has left the document. It is not always possible to detect this\n // in all cases, but it is generally possible in all browsers, with a few exceptions.\n //\n // Exceptions:\n // * IE10+ & Safari: We can't detect a file leaving the document if the Explorer window housing the file\n // overlays the browser window.\n // * IE10+: If the file is dragged out of the window too quickly, IE does not set the expected values of the\n // event's X & Y properties.\n function leavingDocumentOut(e) {\n if (qq.safari()) {\n return e.x < 0 || e.y < 0;\n }\n\n return e.x === 0 && e.y === 0;\n }\n\n function setupDragDrop() {\n var dropZones = options.dropZoneElements,\n\n maybeHideDropZones = function() {\n setTimeout(function() {\n qq.each(dropZones, function(idx, dropZone) {\n qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR) && qq(dropZone).hide();\n qq(dropZone).removeClass(options.classes.dropActive);\n });\n }, 10);\n };\n\n qq.each(dropZones, function(idx, dropZone) {\n var uploadDropZone = setupDropzone(dropZone);\n\n // IE <= 9 does not support the File API used for drag+drop uploads\n if (dropZones.length && qq.supportedFeatures.fileDrop) {\n disposeSupport.attach(document, \"dragenter\", function(e) {\n if (!uploadDropZone.dropDisabled() && isFileDrag(e)) {\n qq.each(dropZones, function(idx, dropZone) {\n // We can't apply styles to non-HTMLElements, since they lack the `style` property.\n // Also, if the drop zone isn't initially hidden, let's not mess with `style.display`.\n if (dropZone instanceof HTMLElement &&\n qq(dropZone).hasAttribute(HIDE_BEFORE_ENTER_ATTR)) {\n\n qq(dropZone).css({display: \"block\"});\n }\n });\n }\n });\n }\n });\n\n disposeSupport.attach(document, \"dragleave\", function(e) {\n if (leavingDocumentOut(e)) {\n maybeHideDropZones();\n }\n });\n\n // Just in case we were not able to detect when a dragged file has left the document,\n // hide all relevant drop zones the next time the mouse enters the document.\n // Note that mouse events such as this one are not fired during drag operations.\n disposeSupport.attach(qq(document).children()[0], \"mouseenter\", function(e) {\n maybeHideDropZones();\n });\n\n disposeSupport.attach(document, \"drop\", function(e) {\n if (isFileDrag(e)) {\n e.preventDefault();\n maybeHideDropZones();\n }\n });\n\n disposeSupport.attach(document, HIDE_ZONES_EVENT_NAME, maybeHideDropZones);\n }\n\n setupDragDrop();\n\n qq.extend(this, {\n setupExtraDropzone: function(element) {\n options.dropZoneElements.push(element);\n setupDropzone(element);\n },\n\n removeDropzone: function(element) {\n var i,\n dzs = options.dropZoneElements;\n\n for (i in dzs) {\n if (dzs[i] === element) {\n return dzs.splice(i, 1);\n }\n }\n },\n\n dispose: function() {\n disposeSupport.dispose();\n qq.each(uploadDropZones, function(idx, dropZone) {\n dropZone.dispose();\n });\n }\n });\n\n this._testing = {};\n this._testing.extractDirectoryPath = extractDirectoryPath;\n};\n\nqq.DragAndDrop.callbacks = function() {\n \"use strict\";\n\n return {\n processingDroppedFiles: function() {},\n processingDroppedFilesComplete: function(files, targetEl) {},\n dropError: function(code, errorSpecifics) {\n qq.log(\"Drag & drop error code '\" + code + \" with these specifics: '\" + errorSpecifics + \"'\", \"error\");\n },\n dropLog: function(message, level) {\n qq.log(message, level);\n }\n };\n};\n\nqq.UploadDropZone = function(o) {\n \"use strict\";\n\n var disposeSupport = new qq.DisposeSupport(),\n options, element, preventDrop, dropOutsideDisabled;\n\n options = {\n element: null,\n onEnter: function(e) {},\n onLeave: function(e) {},\n // is not fired when leaving element by hovering descendants\n onLeaveNotDescendants: function(e) {},\n onDrop: function(e) {}\n };\n\n qq.extend(options, o);\n element = options.element;\n\n function dragoverShouldBeCanceled() {\n return qq.safari() || (qq.firefox() && qq.windows());\n }\n\n function disableDropOutside(e) {\n // run only once for all instances\n if (!dropOutsideDisabled) {\n\n // for these cases we need to catch onDrop to reset dropArea\n if (dragoverShouldBeCanceled) {\n disposeSupport.attach(document, \"dragover\", function(e) {\n e.preventDefault();\n });\n } else {\n disposeSupport.attach(document, \"dragover\", function(e) {\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"none\";\n e.preventDefault();\n }\n });\n }\n\n dropOutsideDisabled = true;\n }\n }\n\n function isValidFileDrag(e) {\n // e.dataTransfer currently causing IE errors\n // IE9 does NOT support file API, so drag-and-drop is not possible\n if (!qq.supportedFeatures.fileDrop) {\n return false;\n }\n\n var effectTest, dt = e.dataTransfer,\n // do not check dt.types.contains in webkit, because it crashes safari 4\n isSafari = qq.safari();\n\n // dt.effectAllowed is none in Safari 5\n\n // dt.effectAllowed crashes IE 11 & 10 when files have been dragged from\n // the filesystem\n effectTest = qq.ie() && qq.supportedFeatures.fileDrop ? true : dt.effectAllowed !== \"none\";\n return dt && effectTest &&\n (\n (dt.files && dt.files.length) || // Valid for drop events with files\n (!isSafari && dt.types.contains && dt.types.contains(\"Files\")) || // Valid in Chrome/Firefox\n (dt.types.includes && dt.types.includes(\"Files\")) // Valid in IE\n );\n }\n\n function isOrSetDropDisabled(isDisabled) {\n if (isDisabled !== undefined) {\n preventDrop = isDisabled;\n }\n return preventDrop;\n }\n\n function triggerHidezonesEvent() {\n var hideZonesEvent;\n\n function triggerUsingOldApi() {\n hideZonesEvent = document.createEvent(\"Event\");\n hideZonesEvent.initEvent(options.HIDE_ZONES_EVENT_NAME, true, true);\n }\n\n if (window.CustomEvent) {\n try {\n hideZonesEvent = new CustomEvent(options.HIDE_ZONES_EVENT_NAME);\n }\n catch (err) {\n triggerUsingOldApi();\n }\n }\n else {\n triggerUsingOldApi();\n }\n\n document.dispatchEvent(hideZonesEvent);\n }\n\n function attachEvents() {\n disposeSupport.attach(element, \"dragover\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n // dt.effectAllowed crashes IE 11 & 10 when files have been dragged from\n // the filesystem\n var effect = qq.ie() && qq.supportedFeatures.fileDrop ? null : e.dataTransfer.effectAllowed;\n if (effect === \"move\" || effect === \"linkMove\") {\n e.dataTransfer.dropEffect = \"move\"; // for FF (only move allowed)\n } else {\n e.dataTransfer.dropEffect = \"copy\"; // for Chrome\n }\n\n e.stopPropagation();\n e.preventDefault();\n });\n\n disposeSupport.attach(element, \"dragenter\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n options.onEnter(e);\n }\n });\n\n disposeSupport.attach(element, \"dragleave\", function(e) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n options.onLeave(e);\n\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n // do not fire when moving a mouse over a descendant\n if (qq(this).contains(relatedTarget)) {\n return;\n }\n\n options.onLeaveNotDescendants(e);\n });\n\n disposeSupport.attach(element, \"drop\", function(e) {\n if (!isOrSetDropDisabled()) {\n if (!isValidFileDrag(e)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n options.onDrop(e);\n\n triggerHidezonesEvent();\n }\n });\n }\n\n disableDropOutside();\n attachEvents();\n\n qq.extend(this, {\n dropDisabled: function(isDisabled) {\n return isOrSetDropDisabled(isDisabled);\n },\n\n dispose: function() {\n disposeSupport.dispose();\n },\n\n getElement: function() {\n return element;\n }\n });\n\n this._testing = {};\n this._testing.isValidFileDrag = isValidFileDrag;\n};\n"]} \ No newline at end of file diff --git a/resources/fine-uploader/edit.gif b/resources/fine-uploader/edit.gif new file mode 100644 index 0000000..403e7c6 Binary files /dev/null and b/resources/fine-uploader/edit.gif differ diff --git a/resources/fine-uploader/fine-uploader-gallery.css b/resources/fine-uploader/fine-uploader-gallery.css new file mode 100644 index 0000000..bdcca3b --- /dev/null +++ b/resources/fine-uploader/fine-uploader-gallery.css @@ -0,0 +1,471 @@ +/* --------------------------------------- +/* Fine Uploader Gallery View Styles +/* --------------------------------------- + + +/* Buttons +------------------------------------------ */ +.qq-gallery .qq-btn +{ + float: right; + border: none; + padding: 0; + margin: 0; + box-shadow: none; +} + +/* Upload Button +------------------------------------------ */ +.qq-gallery .qq-upload-button { + display: inline; + width: 105px; + padding: 7px 10px; + float: left; + text-align: center; + background: #00ABC7; + color: #FFFFFF; + border-radius: 2px; + border: 1px solid #37B7CC; + box-shadow: 0 1px 1px rgba(255, 255, 255, 0.37) inset, + 1px 0 1px rgba(255, 255, 255, 0.07) inset, + 0 1px 0 rgba(0, 0, 0, 0.36), + 0 -2px 12px rgba(0, 0, 0, 0.08) inset +} +.qq-gallery .qq-upload-button-hover { + background: #33B6CC; +} +.qq-gallery .qq-upload-button-focus { + outline: 1px dotted #000000; +} + + +/* Drop Zone +------------------------------------------ */ +.qq-gallery.qq-uploader { + position: relative; + min-height: 200px; + max-height: 490px; + overflow-y: hidden; + width: inherit; + border-radius: 6px; + border: 1px dashed #CCCCCC; + background-color: #FAFAFA; + padding: 20px; +} +.qq-gallery.qq-uploader:before { + content: attr(qq-drop-area-text) " "; + position: absolute; + font-size: 200%; + left: 0; + width: 100%; + text-align: center; + top: 45%; + opacity: 0.25; + filter: alpha(opacity=25); +} +.qq-gallery .qq-upload-drop-area, .qq-upload-extra-drop-area { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + min-height: 30px; + z-index: 2; + background: #F9F9F9; + border-radius: 4px; + text-align: center; +} +.qq-gallery .qq-upload-drop-area span { + display: block; + position: absolute; + top: 50%; + width: 100%; + margin-top: -8px; + font-size: 16px; +} +.qq-gallery .qq-upload-extra-drop-area { + position: relative; + margin-top: 50px; + font-size: 16px; + padding-top: 30px; + height: 20px; + min-height: 40px; +} +.qq-gallery .qq-upload-drop-area-active { + background: #FDFDFD; + border-radius: 4px; +} +.qq-gallery .qq-upload-list { + margin: 0; + padding: 10px 0 0; + list-style: none; + max-height: 450px; + overflow-y: auto; + clear: both; + box-shadow: none; +} + + +/* Uploaded Elements +------------------------------------------ */ +.qq-gallery .qq-upload-list li { + display: inline-block; + position: relative; + max-width: 120px; + margin: 0 25px 25px 0; + padding: 0; + line-height: 16px; + font-size: 13px; + color: #424242; + background-color: #FFFFFF; + border-radius: 2px; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.22); + vertical-align: top; + + /* to ensure consistent size of tiles - may need to change if qq-max-size attr on preview img changes */ + height: 186px; +} + +.qq-gallery .qq-upload-spinner, +.qq-gallery .qq-upload-size, +.qq-gallery .qq-upload-retry, +.qq-gallery .qq-upload-failed-text, +.qq-gallery .qq-upload-delete, +.qq-gallery .qq-upload-pause, +.qq-gallery .qq-upload-continue { + display: inline; +} +.qq-gallery .qq-upload-retry:hover, +.qq-gallery .qq-upload-delete:hover, +.qq-gallery .qq-upload-pause:hover, +.qq-gallery .qq-upload-continue:hover { + background-color: transparent; +} +.qq-gallery .qq-upload-delete, +.qq-gallery .qq-upload-pause, +.qq-gallery .qq-upload-continue, +.qq-gallery .qq-upload-cancel { + cursor: pointer; +} +.qq-gallery .qq-upload-delete, +.qq-gallery .qq-upload-pause, +.qq-gallery .qq-upload-continue { + border:none; + background: none; + color: #00A0BA; + font-size: 12px; + padding: 0; +} +/* to ensure consistent size of tiles - only display status text before auto-retry or after failure */ +.qq-gallery .qq-upload-status-text { + color: #333333; + font-size: 12px; + padding-left: 3px; + padding-top: 2px; + width: inherit; + display: none; + width: 108px; +} +.qq-gallery .qq-upload-fail .qq-upload-status-text { + text-overflow: ellipsis; + white-space: nowrap; + overflow-x: hidden; + display: block; +} +.qq-gallery .qq-upload-retrying .qq-upload-status-text { + display: inline-block; +} +.qq-gallery .qq-upload-retrying .qq-progress-bar-container { + display: none; +} + +.qq-gallery .qq-upload-cancel { + background-color: #525252; + color: #F7F7F7; + font-weight: bold; + font-family: Arial, Helvetica, sans-serif; + border-radius: 12px; + border: none; + height: 22px; + width: 22px; + padding: 4px; + position: absolute; + right: -5px; + top: -6px; + margin: 0; + line-height: 17px; +} +.qq-gallery .qq-upload-cancel:hover { + background-color: #525252; +} +.qq-gallery .qq-upload-retry { + cursor: pointer; + position: absolute; + top: 30px; + left: 50%; + margin-left: -31px; + box-shadow: 0 1px 1px rgba(255, 255, 255, 0.37) inset, + 1px 0 1px rgba(255, 255, 255, 0.07) inset, + 0 4px 4px rgba(0, 0, 0, 0.5), + 0 -2px 12px rgba(0, 0, 0, 0.08) inset; + padding: 3px 4px; + border: 1px solid #d2ddc7; + border-radius: 2px; + color: inherit; + background-color: #EBF6E0; + z-index: 1; +} +.qq-gallery .qq-upload-retry:hover { + background-color: #f7ffec; +} + +.qq-gallery .qq-file-info { + padding: 10px 6px 4px; + margin-top: -3px; + border-radius: 0 0 2px 2px; + text-align: left; + overflow: hidden; +} + +.qq-gallery .qq-file-info .qq-file-name { + position: relative; +} + +.qq-gallery .qq-upload-file { + display: block; + margin-right: 0; + margin-bottom: 3px; + width: auto; + + /* to ensure consistent size of tiles - constrain text to single line */ + text-overflow: ellipsis; + white-space: nowrap; + overflow-x: hidden; +} +.qq-gallery .qq-upload-spinner { + display: inline-block; + background: url("loading.gif"); + position: absolute; + left: 50%; + margin-left: -7px; + top: 53px; + width: 15px; + height: 15px; + vertical-align: text-bottom; +} +.qq-gallery .qq-drop-processing { + display: block; +} +.qq-gallery .qq-drop-processing-spinner { + display: inline-block; + background: url("processing.gif"); + width: 24px; + height: 24px; + vertical-align: text-bottom; +} +.qq-gallery .qq-upload-failed-text { + display: none; + font-style: italic; + font-weight: bold; +} +.qq-gallery .qq-upload-failed-icon { + display:none; + width:15px; + height:15px; + vertical-align:text-bottom; +} +.qq-gallery .qq-upload-fail .qq-upload-failed-text { + display: inline; +} +.qq-gallery .qq-upload-retrying .qq-upload-failed-text { + display: inline; +} +.qq-gallery .qq-upload-list li.qq-upload-success { + background-color: #F2F7ED; +} +.qq-gallery .qq-upload-list li.qq-upload-fail { + background-color: #F5EDED; + box-shadow: 0 0 1px 0 red; + border: 0; +} +.qq-gallery .qq-progress-bar { + display: block; + background: #00abc7; + width: 0%; + height: 15px; + border-radius: 6px; + margin-bottom: 3px; +} + +.qq-gallery .qq-total-progress-bar { + height: 25px; + border-radius: 9px; +} + +.qq-gallery .qq-total-progress-bar-container { + margin-left: 9px; + display: inline; + float: right; + width: 500px; +} + +.qq-gallery .qq-upload-size { + float: left; + font-size: 11px; + color: #929292; + margin-bottom: 3px; + margin-right: 0; + display: inline-block; +} + +.qq-gallery INPUT.qq-edit-filename { + position: absolute; + opacity: 0; + filter: alpha(opacity=0); + z-index: -1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} + +.qq-gallery .qq-upload-file.qq-editable { + cursor: pointer; + margin-right: 20px; +} + +.qq-gallery .qq-edit-filename-icon.qq-editable { + display: inline-block; + cursor: pointer; + position: absolute; + right: 0; + top: 0; +} + +.qq-gallery INPUT.qq-edit-filename.qq-editing { + position: static; + height: 28px; + width: 90px; + width: -moz-available; + padding: 0 8px; + margin-bottom: 3px; + border: 1px solid #ccc; + border-radius: 2px; + font-size: 13px; + + opacity: 1; + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; +} + +.qq-gallery .qq-edit-filename-icon { + display: none; + background: url("edit.gif"); + width: 15px; + height: 15px; + vertical-align: text-bottom; +} +.qq-gallery .qq-delete-icon { + background: url("trash.gif"); + width: 15px; + height: 15px; + vertical-align: sub; + display: inline-block; +} +.qq-gallery .qq-retry-icon { + background: url("retry.gif"); + width: 15px; + height: 15px; + vertical-align: sub; + display: inline-block; + float: none; +} +.qq-gallery .qq-continue-icon { + background: url("continue.gif"); + width: 15px; + height: 15px; + vertical-align: sub; + display: inline-block; +} +.qq-gallery .qq-pause-icon { + background: url("pause.gif"); + width: 15px; + height: 15px; + vertical-align: sub; + display: inline-block; +} + +.qq-gallery .qq-hide { + display: none; +} + + +/* Thumbnail +------------------------------------------ */ +.qq-gallery .qq-in-progress .qq-thumbnail-wrapper { + /* makes the spinner on top of the thumbnail more visible */ + opacity: 0.5; + filter: alpha(opacity=50); +} +.qq-gallery .qq-thumbnail-wrapper { + overflow: hidden; + position: relative; + + /* to ensure consistent size of tiles - should match qq-max-size attribute value on qq-thumbnail-selector IMG element */ + height: 120px; + width: 120px; +} +.qq-gallery .qq-thumbnail-selector { + border-radius: 2px 2px 0 0; + bottom: 0; + + /* we will override this in the :root thumbnail selector (to help center the preview) for everything other than IE8 */ + top: 0; + + /* center the thumb horizontally in the tile */ + margin:auto; + display: block; +} + +/* hack to ensure we don't try to center preview in IE8, since -ms-filter doesn't mimic translateY as expected in all cases */ +:root *> .qq-gallery .qq-thumbnail-selector { + /* vertically center preview image on tile */ + position: relative; + top: 50%; + transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -webkit-transform: translateY(-50%); +} + +/* element styles */ +.qq-gallery.qq-uploader DIALOG { + display: none; +} + +.qq-gallery.qq-uploader DIALOG[open] { + display: block; +} + +.qq-gallery.qq-uploader DIALOG { + display: none; +} + +.qq-gallery.qq-uploader DIALOG[open] { + display: block; +} + +.qq-gallery.qq-uploader DIALOG .qq-dialog-buttons { + text-align: center; + padding-top: 10px; +} + +.qq-gallery.qq-uploader DIALOG .qq-dialog-buttons BUTTON { + margin-left: 5px; + margin-right: 5px; +} + +.qq-gallery.qq-uploader DIALOG .qq-dialog-message-selector { + padding-bottom: 10px; +} + +.qq-gallery .qq-uploader DIALOG::backdrop { + background-color: rgba(0, 0, 0, 0.7); +} \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader-gallery.min.css b/resources/fine-uploader/fine-uploader-gallery.min.css new file mode 100644 index 0000000..ecdadfe --- /dev/null +++ b/resources/fine-uploader/fine-uploader-gallery.min.css @@ -0,0 +1 @@ +.qq-gallery .qq-btn{float:right;border:none;padding:0;margin:0;box-shadow:none}.qq-gallery .qq-upload-button{display:inline;width:105px;padding:7px 10px;float:left;text-align:center;background:#00abc7;color:#fff;border-radius:2px;border:1px solid #37b7cc;box-shadow:0 1px 1px rgba(255,255,255,.37) inset,1px 0 1px rgba(255,255,255,.07) inset,0 1px 0 rgba(0,0,0,.36),0 -2px 12px rgba(0,0,0,.08) inset}.qq-gallery .qq-upload-button-hover{background:#33b6cc}.qq-gallery .qq-upload-button-focus{outline:1px dotted #000}.qq-gallery.qq-uploader{position:relative;min-height:200px;max-height:490px;overflow-y:hidden;width:inherit;border-radius:6px;border:1px dashed #ccc;background-color:#fafafa;padding:20px}.qq-gallery.qq-uploader:before{content:attr(qq-drop-area-text) " ";position:absolute;font-size:200%;left:0;width:100%;text-align:center;top:45%;opacity:.25}.qq-gallery .qq-upload-drop-area,.qq-upload-extra-drop-area{position:absolute;top:0;left:0;width:100%;height:100%;min-height:30px;z-index:2;background:#f9f9f9;border-radius:4px;text-align:center}.qq-gallery .qq-upload-drop-area span{display:block;position:absolute;top:50%;width:100%;margin-top:-8px;font-size:16px}.qq-gallery .qq-upload-extra-drop-area{position:relative;margin-top:50px;font-size:16px;padding-top:30px;height:20px;min-height:40px}.qq-gallery .qq-upload-drop-area-active{background:#fdfdfd;border-radius:4px}.qq-gallery .qq-upload-list{margin:0;padding:10px 0 0;list-style:none;max-height:450px;overflow-y:auto;clear:both;box-shadow:none}.qq-gallery .qq-upload-list li{display:inline-block;position:relative;max-width:120px;margin:0 25px 25px 0;padding:0;line-height:16px;font-size:13px;color:#424242;background-color:#fff;border-radius:2px;box-shadow:0 1px 1px 0 rgba(0,0,0,.22);vertical-align:top;height:186px}.qq-gallery .qq-upload-continue,.qq-gallery .qq-upload-delete,.qq-gallery .qq-upload-failed-text,.qq-gallery .qq-upload-pause,.qq-gallery .qq-upload-retry,.qq-gallery .qq-upload-size,.qq-gallery .qq-upload-spinner{display:inline}.qq-gallery .qq-upload-continue:hover,.qq-gallery .qq-upload-delete:hover,.qq-gallery .qq-upload-pause:hover,.qq-gallery .qq-upload-retry:hover{background-color:transparent}.qq-gallery .qq-upload-cancel,.qq-gallery .qq-upload-continue,.qq-gallery .qq-upload-delete,.qq-gallery .qq-upload-pause{cursor:pointer}.qq-gallery .qq-upload-continue,.qq-gallery .qq-upload-delete,.qq-gallery .qq-upload-pause{border:none;background:0 0;color:#00a0ba;font-size:12px;padding:0}.qq-gallery .qq-upload-status-text{color:#333;font-size:12px;padding-left:3px;padding-top:2px;width:inherit;display:none;width:108px}.qq-gallery .qq-upload-fail .qq-upload-status-text{text-overflow:ellipsis;white-space:nowrap;overflow-x:hidden;display:block}.qq-gallery .qq-upload-retrying .qq-upload-status-text{display:inline-block}.qq-gallery .qq-upload-retrying .qq-progress-bar-container{display:none}.qq-gallery .qq-upload-cancel{background-color:#525252;color:#f7f7f7;font-weight:700;font-family:Arial,Helvetica,sans-serif;border-radius:12px;border:none;height:22px;width:22px;padding:4px;position:absolute;right:-5px;top:-6px;margin:0;line-height:17px}.qq-gallery .qq-upload-cancel:hover{background-color:#525252}.qq-gallery .qq-upload-retry{cursor:pointer;position:absolute;top:30px;left:50%;margin-left:-31px;box-shadow:0 1px 1px rgba(255,255,255,.37) inset,1px 0 1px rgba(255,255,255,.07) inset,0 4px 4px rgba(0,0,0,.5),0 -2px 12px rgba(0,0,0,.08) inset;padding:3px 4px;border:1px solid #d2ddc7;border-radius:2px;color:inherit;background-color:#ebf6e0;z-index:1}.qq-gallery .qq-upload-retry:hover{background-color:#f7ffec}.qq-gallery .qq-file-info{padding:10px 6px 4px;margin-top:-3px;border-radius:0 0 2px 2px;text-align:left;overflow:hidden}.qq-gallery .qq-file-info .qq-file-name{position:relative}.qq-gallery .qq-upload-file{display:block;margin-right:0;margin-bottom:3px;width:auto;text-overflow:ellipsis;white-space:nowrap;overflow-x:hidden}.qq-gallery .qq-upload-spinner{display:inline-block;background:url(loading.gif);position:absolute;left:50%;margin-left:-7px;top:53px;width:15px;height:15px;vertical-align:text-bottom}.qq-gallery .qq-drop-processing{display:block}.qq-gallery .qq-drop-processing-spinner{display:inline-block;background:url(processing.gif);width:24px;height:24px;vertical-align:text-bottom}.qq-gallery .qq-upload-failed-text{display:none;font-style:italic;font-weight:700}.qq-gallery .qq-upload-failed-icon{display:none;width:15px;height:15px;vertical-align:text-bottom}.qq-gallery .qq-upload-fail .qq-upload-failed-text{display:inline}.qq-gallery .qq-upload-retrying .qq-upload-failed-text{display:inline}.qq-gallery .qq-upload-list li.qq-upload-success{background-color:#f2f7ed}.qq-gallery .qq-upload-list li.qq-upload-fail{background-color:#f5eded;box-shadow:0 0 1px 0 red;border:0}.qq-gallery .qq-progress-bar{display:block;background:#00abc7;width:0;height:15px;border-radius:6px;margin-bottom:3px}.qq-gallery .qq-total-progress-bar{height:25px;border-radius:9px}.qq-gallery .qq-total-progress-bar-container{margin-left:9px;display:inline;float:right;width:500px}.qq-gallery .qq-upload-size{float:left;font-size:11px;color:#929292;margin-bottom:3px;margin-right:0;display:inline-block}.qq-gallery INPUT.qq-edit-filename{position:absolute;opacity:0;z-index:-1}.qq-gallery .qq-upload-file.qq-editable{cursor:pointer;margin-right:20px}.qq-gallery .qq-edit-filename-icon.qq-editable{display:inline-block;cursor:pointer;position:absolute;right:0;top:0}.qq-gallery INPUT.qq-edit-filename.qq-editing{position:static;height:28px;width:90px;width:-moz-available;padding:0 8px;margin-bottom:3px;border:1px solid #ccc;border-radius:2px;font-size:13px;opacity:1}.qq-gallery .qq-edit-filename-icon{display:none;background:url(edit.gif);width:15px;height:15px;vertical-align:text-bottom}.qq-gallery .qq-delete-icon{background:url(trash.gif);width:15px;height:15px;vertical-align:sub;display:inline-block}.qq-gallery .qq-retry-icon{background:url(retry.gif);width:15px;height:15px;vertical-align:sub;display:inline-block;float:none}.qq-gallery .qq-continue-icon{background:url(continue.gif);width:15px;height:15px;vertical-align:sub;display:inline-block}.qq-gallery .qq-pause-icon{background:url(pause.gif);width:15px;height:15px;vertical-align:sub;display:inline-block}.qq-gallery .qq-hide{display:none}.qq-gallery .qq-in-progress .qq-thumbnail-wrapper{/* makes the spinner on top of the thumbnail more visible */opacity:.5}.qq-gallery .qq-thumbnail-wrapper{overflow:hidden;position:relative;height:120px;width:120px}.qq-gallery .qq-thumbnail-selector{border-radius:2px 2px 0 0;bottom:0;top:0;margin:auto;display:block}:root *>.qq-gallery .qq-thumbnail-selector{position:relative;top:50%;transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-webkit-transform:translateY(-50%)}.qq-gallery.qq-uploader DIALOG{display:none}.qq-gallery.qq-uploader DIALOG[open]{display:block}.qq-gallery.qq-uploader DIALOG{display:none}.qq-gallery.qq-uploader DIALOG[open]{display:block}.qq-gallery.qq-uploader DIALOG .qq-dialog-buttons{text-align:center;padding-top:10px}.qq-gallery.qq-uploader DIALOG .qq-dialog-buttons BUTTON{margin-left:5px;margin-right:5px}.qq-gallery.qq-uploader DIALOG .qq-dialog-message-selector{padding-bottom:10px}.qq-gallery .qq-uploader DIALOG::backdrop{background-color:rgba(0,0,0,.7)}/*# sourceMappingURL=fine-uploader-gallery.min.css.map */ \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader-gallery.min.css.map b/resources/fine-uploader/fine-uploader-gallery.min.css.map new file mode 100644 index 0000000..762454e --- /dev/null +++ b/resources/fine-uploader/fine-uploader-gallery.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["_build/fine-uploader-gallery.css"],"names":[],"mappings":"AAOA,oBAEI,MAAO,MACP,OAAQ,KACR,QAAS,EACT,OAAQ,EACR,WAAY,KAKhB,8BACI,QAAS,OACT,MAAO,MACP,QAAS,IAAI,KACb,MAAO,KACP,WAAY,OACZ,WAAY,QACZ,MAAO,KACP,cAAe,IACf,OAAQ,IAAI,MAAM,QAClB,WAAY,EAAE,IAAI,IAAI,sBAA0B,KAAK,CACrD,IAAI,EAAE,IAAI,sBAA0B,KAAK,CACzC,EAAE,IAAI,EAAE,eAAmB,CAC3B,EAAE,KAAK,KAAK,gBAAoB,MAEpC,oCACI,WAAY,QAEhB,oCACI,QAAS,IAAI,OAAO,KAMxB,wBACI,SAAU,SACV,WAAY,MACZ,WAAY,MACZ,WAAY,OACZ,MAAO,QACP,cAAe,IACf,OAAQ,IAAI,OAAO,KACnB,iBAAkB,QAClB,QAAS,KAEb,+BACI,QAAS,wBAAwB,IACjC,SAAU,SACV,UAAW,KACX,KAAM,EACN,MAAO,KACP,WAAY,OACZ,IAAK,IACL,QAAS,IAGb,iCAAkC,2BAC9B,SAAU,SACV,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,WAAY,KACZ,QAAS,EACT,WAAY,QACZ,cAAe,IACf,WAAY,OAEhB,sCACI,QAAS,MACT,SAAU,SACV,IAAK,IACL,MAAO,KACP,WAAY,KACZ,UAAW,KAEf,uCACI,SAAU,SACV,WAAY,KACZ,UAAW,KACX,YAAa,KACb,OAAQ,KACR,WAAY,KAEhB,wCACI,WAAY,QACZ,cAAe,IAEnB,4BACI,OAAQ,EACR,QAAS,KAAK,EAAE,EAChB,WAAY,KACZ,WAAY,MACZ,WAAY,KACZ,MAAO,KACP,WAAY,KAMhB,+BACI,QAAS,aACT,SAAU,SACV,UAAW,MACX,OAAQ,EAAE,KAAK,KAAK,EACpB,QAAS,EACT,YAAa,KACb,UAAW,KACX,MAAO,QACP,iBAAkB,KAClB,cAAe,IACf,WAAY,EAAE,IAAI,IAAI,EAAE,gBACxB,eAAgB,IAGhB,OAAQ,MASZ,gCAFA,8BADA,mCAEA,6BAHA,6BADA,4BADA,+BAOI,QAAS,OAKb,sCAFA,oCACA,mCAFA,mCAII,iBAAkB,YAKtB,8BADA,gCAFA,8BACA,6BAGI,OAAQ,QAIZ,gCAFA,8BACA,6BAEI,OAAO,KACP,WAAY,IACZ,MAAO,QACP,UAAW,KACX,QAAS,EAGb,mCACI,MAAO,KACP,UAAW,KACX,aAAc,IACd,YAAa,IACb,MAAO,QACP,QAAS,KACT,MAAO,MAEX,mDACI,cAAe,SACf,YAAa,OACb,WAAY,OACZ,QAAS,MAEb,uDACI,QAAS,aAEb,2DACI,QAAS,KAGb,8BACI,iBAAkB,QAClB,MAAO,QACP,YAAa,IACb,YAAa,KAAK,CAAE,SAAS,CAAE,WAC/B,cAAe,KACf,OAAQ,KACR,OAAQ,KACR,MAAO,KACP,QAAS,IACT,SAAU,SACV,MAAO,KACP,IAAK,KACL,OAAQ,EACR,YAAa,KAEjB,oCACI,iBAAkB,QAEtB,6BACI,OAAQ,QACR,SAAU,SACV,IAAK,KACL,KAAM,IACN,YAAa,MACb,WAAY,EAAE,IAAI,IAAI,sBAA0B,KAAK,CACzC,IAAI,EAAE,IAAI,sBAA0B,KAAK,CACzC,EAAE,IAAI,IAAI,cAAkB,CAC5B,EAAE,KAAK,KAAK,gBAAoB,MAC5C,QAAS,IAAI,IACb,OAAQ,IAAI,MAAM,QAClB,cAAe,IACf,MAAO,QACP,iBAAkB,QAClB,QAAS,EAEb,mCACI,iBAAkB,QAGtB,0BACI,QAAS,KAAK,IAAI,IAClB,WAAY,KACZ,cAAe,EAAE,EAAE,IAAI,IACvB,WAAY,KACZ,SAAU,OAGd,wCACI,SAAU,SAGd,4BACI,QAAS,MACT,aAAc,EACd,cAAe,IACf,MAAO,KAGP,cAAe,SACf,YAAa,OACb,WAAY,OAEhB,+BACI,QAAS,aACT,WAAY,iBACZ,SAAU,SACV,KAAM,IACN,YAAa,KACb,IAAK,KACL,MAAO,KACP,OAAQ,KACR,eAAgB,YAEpB,gCACI,QAAS,MAEb,wCACI,QAAS,aACT,WAAY,oBACZ,MAAO,KACP,OAAQ,KACR,eAAgB,YAEpB,mCACI,QAAS,KACT,WAAY,OACZ,YAAa,IAEjB,mCACI,QAAQ,KACR,MAAM,KACN,OAAO,KACP,eAAe,YAEnB,mDACI,QAAS,OAEb,uDACI,QAAS,OAEb,iDACI,iBAAkB,QAEtB,8CACI,iBAAkB,QAClB,WAAY,EAAE,EAAE,IAAI,EAAE,IACtB,OAAQ,EAEZ,6BACI,QAAS,MACT,WAAY,QACZ,MAAO,EACP,OAAQ,KACR,cAAe,IACf,cAAe,IAGnB,mCACI,OAAQ,KACR,cAAe,IAGnB,6CACI,YAAa,IACb,QAAS,OACT,MAAO,MACP,MAAO,MAGX,4BACI,MAAO,KACP,UAAW,KACX,MAAO,QACP,cAAe,IACf,aAAc,EACd,QAAS,aAGb,mCACI,SAAU,SACV,QAAS,EAET,QAAS,GAIb,wCACI,OAAQ,QACR,aAAc,KAGlB,+CACI,QAAS,aACT,OAAQ,QACR,SAAU,SACV,MAAO,EACP,IAAK,EAGT,8CACI,SAAU,OACV,OAAQ,KACR,MAAO,KACP,MAAO,eACP,QAAS,EAAE,IACX,cAAe,IACf,OAAQ,IAAI,MAAM,KAClB,cAAe,IACf,UAAW,KAEX,QAAS,EAKb,mCACI,QAAS,KACT,WAAY,cACZ,MAAO,KACP,OAAQ,KACR,eAAgB,YAEpB,4BACI,WAAY,eACZ,MAAO,KACP,OAAQ,KACR,eAAgB,IAChB,QAAS,aAEb,2BACI,WAAY,eACZ,MAAO,KACP,OAAQ,KACR,eAAgB,IAChB,QAAS,aACT,MAAO,KAEX,8BACI,WAAY,kBACZ,MAAO,KACP,OAAQ,KACR,eAAgB,IAChB,QAAS,aAEb,2BACI,WAAY,eACZ,MAAO,KACP,OAAQ,KACR,eAAgB,IAChB,QAAS,aAGb,qBACI,QAAS,KAMb,kDACI,4DACA,QAAS,GAGb,kCACI,SAAU,OACV,SAAU,SAGV,OAAQ,MACR,MAAO,MAEX,mCACI,cAAe,IAAI,IAAI,EAAE,EACzB,OAAQ,EAGR,IAAK,EAGL,OAAO,KACP,QAAS,MAIb,2CAEI,SAAU,SACV,IAAK,IACL,UAAW,iBACX,eAAgB,iBAChB,cAAe,iBACf,kBAAmB,iBAIvB,+BACI,QAAS,KAGb,qCACI,QAAS,MAGb,+BACI,QAAS,KAGb,qCACI,QAAS,MAGb,kDACI,WAAY,OACZ,YAAa,KAGjB,yDACI,YAAa,IACb,aAAc,IAGlB,2DACI,eAAgB,KAGpB,0CACI,iBAAkB"} \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader-new.css b/resources/fine-uploader/fine-uploader-new.css new file mode 100644 index 0000000..c7678a3 --- /dev/null +++ b/resources/fine-uploader/fine-uploader-new.css @@ -0,0 +1,354 @@ +/* --------------------------------------- +/* Fine Uploader Styles +/* --------------------------------------- + +/* Buttons +------------------------------------------ */ +.qq-btn +{ + box-shadow: 0 1px 1px rgba(255, 255, 255, 0.37) inset, + 1px 0 1px rgba(255, 255, 255, 0.07) inset, + 0 1px 0 rgba(0, 0, 0, 0.36), + 0 -2px 12px rgba(0, 0, 0, 0.08) inset; + padding: 3px 4px; + border: 1px solid #CCCCCC; + border-radius: 2px; + color: inherit; + background-color: #FFFFFF; +} +.qq-upload-delete, .qq-upload-pause, .qq-upload-continue { + display: inline; +} +.qq-upload-delete +{ + background-color: #e65c47; + color: #FAFAFA; + border-color: #dc523d; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.55); +} +.qq-upload-delete:hover { + background-color: #f56b56; + } +.qq-upload-cancel +{ + background-color: #F5D7D7; + border-color: #e6c8c8; +} +.qq-upload-cancel:hover { + background-color: #ffe1e1; +} +.qq-upload-retry +{ + background-color: #EBF6E0; + border-color: #d2ddc7; +} +.qq-upload-retry:hover { + background-color: #f7ffec; +} +.qq-upload-pause, .qq-upload-continue { + background-color: #00ABC7; + color: #FAFAFA; + border-color: #2dadc2; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.55); +} +.qq-upload-pause:hover, .qq-upload-continue:hover { + background-color: #0fbad6; +} + +/* Upload Button +------------------------------------------ */ +.qq-upload-button { + display: inline; + width: 105px; + margin-bottom: 10px; + padding: 7px 10px; + text-align: center; + float: left; + background: #00ABC7; + color: #FFFFFF; + border-radius: 2px; + border: 1px solid #2dadc2; + box-shadow: 0 1px 1px rgba(255, 255, 255, 0.37) inset, + 1px 0 1px rgba(255, 255, 255, 0.07) inset, + 0 1px 0 rgba(0, 0, 0, 0.36), + 0 -2px 12px rgba(0, 0, 0, 0.08) inset; +} +.qq-upload-button-hover { + background: #33B6CC; +} +.qq-upload-button-focus { + outline: 1px dotted #000000; +} + + +/* Drop Zone +------------------------------------------ */ +.qq-uploader { + position: relative; + min-height: 200px; + max-height: 490px; + overflow-y: hidden; + width: inherit; + border-radius: 6px; + background-color: #FDFDFD; + border: 1px dashed #CCCCCC; + padding: 20px; +} +.qq-uploader:before { + content: attr(qq-drop-area-text) " "; + position: absolute; + font-size: 200%; + left: 0; + width: 100%; + text-align: center; + top: 45%; + opacity: 0.25; +} +.qq-upload-drop-area, .qq-upload-extra-drop-area { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + min-height: 30px; + z-index: 2; + background: #F9F9F9; + border-radius: 4px; + border: 1px dashed #CCCCCC; + text-align: center; +} +.qq-upload-drop-area span { + display: block; + position: absolute; + top: 50%; + width: 100%; + margin-top: -8px; + font-size: 16px; +} +.qq-upload-extra-drop-area { + position: relative; + margin-top: 50px; + font-size: 16px; + padding-top: 30px; + height: 20px; + min-height: 40px; +} +.qq-upload-drop-area-active { + background: #FDFDFD; + border-radius: 4px; + border: 1px dashed #CCCCCC; +} +.qq-upload-list { + margin: 0; + padding: 0; + list-style: none; + max-height: 450px; + overflow-y: auto; + box-shadow: 0px 1px 0px rgba(15, 15, 50, 0.14); + clear: both; +} + + +/* Uploaded Elements +------------------------------------------ */ +.qq-upload-list li { + margin: 0; + padding: 9px; + line-height: 15px; + font-size: 16px; + color: #424242; + background-color: #F6F6F6; + border-top: 1px solid #FFFFFF; + border-bottom: 1px solid #DDDDDD; +} +.qq-upload-list li:first-child { + border-top: none; +} +.qq-upload-list li:last-child { + border-bottom: none; +} + +.qq-upload-file, .qq-upload-spinner, .qq-upload-size, +.qq-upload-cancel, .qq-upload-retry, .qq-upload-failed-text, +.qq-upload-delete, .qq-upload-pause, .qq-upload-continue { + margin-right: 12px; + display: inline; +} +.qq-upload-file { + vertical-align: middle; + display: inline-block; + width: 300px; + text-overflow: ellipsis; + white-space: nowrap; + overflow-x: hidden; + height: 18px; +} +.qq-upload-spinner { + display: inline-block; + background: url("loading.gif"); + width: 15px; + height: 15px; + vertical-align: text-bottom; +} +.qq-drop-processing { + display: block; +} +.qq-drop-processing-spinner { + display: inline-block; + background: url("processing.gif"); + width: 24px; + height: 24px; + vertical-align: text-bottom; +} +.qq-upload-size, .qq-upload-cancel, .qq-upload-retry, +.qq-upload-delete, .qq-upload-pause, .qq-upload-continue { + font-size: 12px; + font-weight: normal; + cursor: pointer; + vertical-align: middle; +} +.qq-upload-status-text { + font-size: 14px; + font-weight: bold; + display: block; +} +.qq-upload-failed-text { + display: none; + font-style: italic; + font-weight: bold; +} +.qq-upload-failed-icon { + display:none; + width:15px; + height:15px; + vertical-align:text-bottom; +} +.qq-upload-fail .qq-upload-failed-text { + display: inline; +} +.qq-upload-retrying .qq-upload-failed-text { + display: inline; +} +.qq-upload-list li.qq-upload-success { + background-color: #EBF6E0; + color: #424242; + border-bottom: 1px solid #D3DED1; + border-top: 1px solid #F7FFF5; +} +.qq-upload-list li.qq-upload-fail { + background-color: #F5D7D7; + color: #424242; + border-bottom: 1px solid #DECACA; + border-top: 1px solid #FCE6E6; +} +.qq-progress-bar { + display: block; + display: block; + background: #00abc7; + width: 0%; + height: 15px; + border-radius: 6px; + margin-bottom: 3px; +} + +.qq-total-progress-bar { + height: 25px; + border-radius: 9px; +} + +.qq-total-progress-bar-container { + margin-left: 9px; + display: inline; + float: right; + width: 500px; +} + +INPUT.qq-edit-filename { + position: absolute; + opacity: 0; + filter: alpha(opacity=0); + z-index: -1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} + +.qq-upload-file.qq-editable { + cursor: pointer; + margin-right: 4px; +} + +.qq-edit-filename-icon.qq-editable { + display: inline-block; + cursor: pointer; +} + +INPUT.qq-edit-filename.qq-editing { + position: static; + height: 28px; + padding: 0 8px; + margin-right: 10px; + margin-bottom: -5px; + border: 1px solid #ccc; + border-radius: 2px; + font-size: 16px; + + opacity: 1; + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; +} + +.qq-edit-filename-icon { + display: none; + background: url("edit.gif"); + width: 15px; + height: 15px; + vertical-align: text-bottom; + margin-right: 16px; +} + +.qq-hide { + display: none; +} + + +/* Thumbnail +------------------------------------------ */ +.qq-thumbnail-selector { + vertical-align: middle; + margin-right: 12px; +} + + +/* element styles */ +.qq-uploader DIALOG { + display: none; +} + +.qq-uploader DIALOG[open] { + display: block; +} + +.qq-uploader DIALOG { + display: none; +} + +.qq-uploader DIALOG[open] { + display: block; +} + +.qq-uploader DIALOG .qq-dialog-buttons { + text-align: center; + padding-top: 10px; +} + +.qq-uploader DIALOG .qq-dialog-buttons BUTTON { + margin-left: 5px; + margin-right: 5px; +} + +.qq-uploader DIALOG .qq-dialog-message-selector { + padding-bottom: 10px; +} + +.qq-uploader DIALOG::backdrop { + background-color: rgba(0, 0, 0, 0.7); +} \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader-new.min.css b/resources/fine-uploader/fine-uploader-new.min.css new file mode 100644 index 0000000..40bcea0 --- /dev/null +++ b/resources/fine-uploader/fine-uploader-new.min.css @@ -0,0 +1 @@ +.qq-btn{box-shadow:0 1px 1px rgba(255,255,255,.37) inset,1px 0 1px rgba(255,255,255,.07) inset,0 1px 0 rgba(0,0,0,.36),0 -2px 12px rgba(0,0,0,.08) inset;padding:3px 4px;border:1px solid #ccc;border-radius:2px;color:inherit;background-color:#fff}.qq-upload-continue,.qq-upload-delete,.qq-upload-pause{display:inline}.qq-upload-delete{background-color:#e65c47;color:#fafafa;border-color:#dc523d;text-shadow:0 1px 1px rgba(0,0,0,.55)}.qq-upload-delete:hover{background-color:#f56b56}.qq-upload-cancel{background-color:#f5d7d7;border-color:#e6c8c8}.qq-upload-cancel:hover{background-color:#ffe1e1}.qq-upload-retry{background-color:#ebf6e0;border-color:#d2ddc7}.qq-upload-retry:hover{background-color:#f7ffec}.qq-upload-continue,.qq-upload-pause{background-color:#00abc7;color:#fafafa;border-color:#2dadc2;text-shadow:0 1px 1px rgba(0,0,0,.55)}.qq-upload-continue:hover,.qq-upload-pause:hover{background-color:#0fbad6}.qq-upload-button{display:inline;width:105px;margin-bottom:10px;padding:7px 10px;text-align:center;float:left;background:#00abc7;color:#fff;border-radius:2px;border:1px solid #2dadc2;box-shadow:0 1px 1px rgba(255,255,255,.37) inset,1px 0 1px rgba(255,255,255,.07) inset,0 1px 0 rgba(0,0,0,.36),0 -2px 12px rgba(0,0,0,.08) inset}.qq-upload-button-hover{background:#33b6cc}.qq-upload-button-focus{outline:1px dotted #000}.qq-uploader{position:relative;min-height:200px;max-height:490px;overflow-y:hidden;width:inherit;border-radius:6px;background-color:#fdfdfd;border:1px dashed #ccc;padding:20px}.qq-uploader:before{content:attr(qq-drop-area-text) " ";position:absolute;font-size:200%;left:0;width:100%;text-align:center;top:45%;opacity:.25}.qq-upload-drop-area,.qq-upload-extra-drop-area{position:absolute;top:0;left:0;width:100%;height:100%;min-height:30px;z-index:2;background:#f9f9f9;border-radius:4px;border:1px dashed #ccc;text-align:center}.qq-upload-drop-area span{display:block;position:absolute;top:50%;width:100%;margin-top:-8px;font-size:16px}.qq-upload-extra-drop-area{position:relative;margin-top:50px;font-size:16px;padding-top:30px;height:20px;min-height:40px}.qq-upload-drop-area-active{background:#fdfdfd;border-radius:4px;border:1px dashed #ccc}.qq-upload-list{margin:0;padding:0;list-style:none;max-height:450px;overflow-y:auto;box-shadow:0 1px 0 rgba(15,15,50,.14);clear:both}.qq-upload-list li{margin:0;padding:9px;line-height:15px;font-size:16px;color:#424242;background-color:#f6f6f6;border-top:1px solid #fff;border-bottom:1px solid #ddd}.qq-upload-list li:first-child{border-top:none}.qq-upload-list li:last-child{border-bottom:none}.qq-upload-cancel,.qq-upload-continue,.qq-upload-delete,.qq-upload-failed-text,.qq-upload-file,.qq-upload-pause,.qq-upload-retry,.qq-upload-size,.qq-upload-spinner{margin-right:12px;display:inline}.qq-upload-file{vertical-align:middle;display:inline-block;width:300px;text-overflow:ellipsis;white-space:nowrap;overflow-x:hidden;height:18px}.qq-upload-spinner{display:inline-block;background:url(loading.gif);width:15px;height:15px;vertical-align:text-bottom}.qq-drop-processing{display:block}.qq-drop-processing-spinner{display:inline-block;background:url(processing.gif);width:24px;height:24px;vertical-align:text-bottom}.qq-upload-cancel,.qq-upload-continue,.qq-upload-delete,.qq-upload-pause,.qq-upload-retry,.qq-upload-size{font-size:12px;font-weight:400;cursor:pointer;vertical-align:middle}.qq-upload-status-text{font-size:14px;font-weight:700;display:block}.qq-upload-failed-text{display:none;font-style:italic;font-weight:700}.qq-upload-failed-icon{display:none;width:15px;height:15px;vertical-align:text-bottom}.qq-upload-fail .qq-upload-failed-text{display:inline}.qq-upload-retrying .qq-upload-failed-text{display:inline}.qq-upload-list li.qq-upload-success{background-color:#ebf6e0;color:#424242;border-bottom:1px solid #d3ded1;border-top:1px solid #f7fff5}.qq-upload-list li.qq-upload-fail{background-color:#f5d7d7;color:#424242;border-bottom:1px solid #decaca;border-top:1px solid #fce6e6}.qq-progress-bar{display:block;display:block;background:#00abc7;width:0;height:15px;border-radius:6px;margin-bottom:3px}.qq-total-progress-bar{height:25px;border-radius:9px}.qq-total-progress-bar-container{margin-left:9px;display:inline;float:right;width:500px}INPUT.qq-edit-filename{position:absolute;opacity:0;z-index:-1}.qq-upload-file.qq-editable{cursor:pointer;margin-right:4px}.qq-edit-filename-icon.qq-editable{display:inline-block;cursor:pointer}INPUT.qq-edit-filename.qq-editing{position:static;height:28px;padding:0 8px;margin-right:10px;margin-bottom:-5px;border:1px solid #ccc;border-radius:2px;font-size:16px;opacity:1}.qq-edit-filename-icon{display:none;background:url(edit.gif);width:15px;height:15px;vertical-align:text-bottom;margin-right:16px}.qq-hide{display:none}.qq-thumbnail-selector{vertical-align:middle;margin-right:12px}.qq-uploader DIALOG{display:none}.qq-uploader DIALOG[open]{display:block}.qq-uploader DIALOG{display:none}.qq-uploader DIALOG[open]{display:block}.qq-uploader DIALOG .qq-dialog-buttons{text-align:center;padding-top:10px}.qq-uploader DIALOG .qq-dialog-buttons BUTTON{margin-left:5px;margin-right:5px}.qq-uploader DIALOG .qq-dialog-message-selector{padding-bottom:10px}.qq-uploader DIALOG::backdrop{background-color:rgba(0,0,0,.7)}/*# sourceMappingURL=fine-uploader-new.min.css.map */ \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader-new.min.css.map b/resources/fine-uploader/fine-uploader-new.min.css.map new file mode 100644 index 0000000..4ef57d3 --- /dev/null +++ b/resources/fine-uploader/fine-uploader-new.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["_build/fine-uploader-new.css"],"names":[],"mappings":"AAMA,QAEI,WAAY,EAAE,IAAI,IAAI,sBAA0B,KAAK,CACzC,IAAI,EAAE,IAAI,sBAA0B,KAAK,CACzC,EAAE,IAAI,EAAE,eAAmB,CAC3B,EAAE,KAAK,KAAK,gBAAoB,MAC5C,QAAS,IAAI,IACb,OAAQ,IAAI,MAAM,KAClB,cAAe,IACf,MAAO,QACP,iBAAkB,KAEe,oBAArC,kBAAmB,iBACf,QAAS,OAEb,kBAEI,iBAAkB,QAClB,MAAO,QACP,aAAc,QACd,YAAa,EAAE,IAAI,IAAI,gBAE3B,wBACI,iBAAkB,QAEtB,kBAEI,iBAAkB,QAClB,aAAc,QAElB,wBACI,iBAAkB,QAEtB,iBAEI,iBAAkB,QAClB,aAAc,QAElB,uBACI,iBAAkB,QAEJ,oBAAlB,iBACI,iBAAkB,QAClB,MAAO,QACP,aAAc,QACd,YAAa,EAAE,IAAI,IAAI,gBAEH,0BAAxB,uBACI,iBAAkB,QAKtB,kBACI,QAAS,OACT,MAAO,MACP,cAAe,KACf,QAAS,IAAI,KACb,WAAY,OACZ,MAAO,KACP,WAAY,QACZ,MAAO,KACP,cAAe,IACf,OAAQ,IAAI,MAAM,QAClB,WAAY,EAAE,IAAI,IAAI,sBAA0B,KAAK,CACzC,IAAI,EAAE,IAAI,sBAA0B,KAAK,CACzC,EAAE,IAAI,EAAE,eAAmB,CAC3B,EAAE,KAAK,KAAK,gBAAoB,MAEhD,wBACI,WAAY,QAEhB,wBACI,QAAS,IAAI,OAAO,KAMxB,aACI,SAAU,SACV,WAAY,MACZ,WAAY,MACZ,WAAY,OACZ,MAAO,QACP,cAAe,IACf,iBAAkB,QAClB,OAAQ,IAAI,OAAO,KACnB,QAAS,KAEb,oBACI,QAAS,wBAAwB,IACjC,SAAU,SACV,UAAW,KACX,KAAM,EACN,MAAO,KACP,WAAY,OACZ,IAAK,IACL,QAAS,IAEb,qBAAsB,2BAClB,SAAU,SACV,IAAK,EACL,KAAM,EACN,MAAO,KACP,OAAQ,KACR,WAAY,KACZ,QAAS,EACT,WAAY,QACZ,cAAe,IACf,OAAQ,IAAI,OAAO,KACnB,WAAY,OAEhB,0BACI,QAAS,MACT,SAAU,SACV,IAAK,IACL,MAAO,KACP,WAAY,KACZ,UAAW,KAEf,2BACI,SAAU,SACV,WAAY,KACZ,UAAW,KACX,YAAa,KACb,OAAQ,KACR,WAAY,KAEhB,4BACI,WAAY,QACZ,cAAe,IACf,OAAQ,IAAI,OAAO,KAEvB,gBACI,OAAQ,EACR,QAAS,EACT,WAAY,KACZ,WAAY,MACZ,WAAY,KACZ,WAAY,EAAI,IAAI,EAAI,mBACxB,MAAO,KAMX,mBACI,OAAQ,EACR,QAAS,IACT,YAAa,KACb,UAAW,KACX,MAAO,QACP,iBAAkB,QAClB,WAAY,IAAI,MAAM,KACtB,cAAe,IAAI,MAAM,KAE7B,+BACI,WAAY,KAEhB,8BACI,cAAe,KAInB,kBACqC,oBAArC,kBADqC,uBADrC,gBAEmB,iBADA,iBADkB,gBAApB,mBAGb,aAAc,KACd,QAAS,OAEb,gBACI,eAAgB,OAChB,QAAS,aACT,MAAO,MACP,cAAe,SACf,YAAa,OACb,WAAY,OACZ,OAAQ,KAEZ,mBACI,QAAS,aACT,WAAY,iBACZ,MAAO,KACP,OAAQ,KACR,eAAgB,YAEpB,oBACI,QAAS,MAEb,4BACI,QAAS,aACT,WAAY,oBACZ,MAAO,KACP,OAAQ,KACR,eAAgB,YAEH,kBACoB,oBAArC,kBAAmB,iBADiB,iBAApC,gBAEI,UAAW,KACX,YAAa,IACb,OAAQ,QACR,eAAgB,OAEpB,uBACI,UAAW,KACX,YAAa,IACb,QAAS,MAEb,uBACI,QAAS,KACT,WAAY,OACZ,YAAa,IAEjB,uBACI,QAAQ,KACR,MAAM,KACN,OAAO,KACP,eAAe,YAEnB,uCACI,QAAS,OAEb,2CACI,QAAS,OAEb,qCACI,iBAAkB,QAClB,MAAO,QACP,cAAe,IAAI,MAAM,QACzB,WAAY,IAAI,MAAM,QAE1B,kCACI,iBAAkB,QAClB,MAAO,QACP,cAAe,IAAI,MAAM,QACzB,WAAY,IAAI,MAAM,QAE1B,iBACI,QAAS,MACT,QAAS,MACT,WAAY,QACZ,MAAO,EACP,OAAQ,KACR,cAAe,IACf,cAAe,IAGnB,uBACI,OAAQ,KACR,cAAe,IAGnB,iCACI,YAAa,IACb,QAAS,OACT,MAAO,MACP,MAAO,MAGX,uBACI,SAAU,SACV,QAAS,EAET,QAAS,GAIb,4BACI,OAAQ,QACR,aAAc,IAGlB,mCACI,QAAS,aACT,OAAQ,QAGZ,kCACI,SAAU,OACV,OAAQ,KACR,QAAS,EAAE,IACX,aAAc,KACd,cAAe,KACf,OAAQ,IAAI,MAAM,KAClB,cAAe,IACf,UAAW,KAEX,QAAS,EAKb,uBACI,QAAS,KACT,WAAY,cACZ,MAAO,KACP,OAAQ,KACR,eAAgB,YAChB,aAAc,KAGlB,SACI,QAAS,KAMb,uBACI,eAAgB,OAChB,aAAc,KAKlB,oBACI,QAAS,KAGb,0BACI,QAAS,MAGb,oBACI,QAAS,KAGb,0BACI,QAAS,MAGb,uCACI,WAAY,OACZ,YAAa,KAGjB,8CACI,YAAa,IACb,aAAc,IAGlB,gDACI,eAAgB,KAGpB,8BACI,iBAAkB"} \ No newline at end of file diff --git a/resources/fine-uploader/fine-uploader.core.js b/resources/fine-uploader/fine-uploader.core.js new file mode 100644 index 0000000..229a128 --- /dev/null +++ b/resources/fine-uploader/fine-uploader.core.js @@ -0,0 +1,5775 @@ +// Fine Uploader 5.16.2 - MIT licensed. http://fineuploader.com +(function(global) { + var qq = function(element) { + "use strict"; + return { + hide: function() { + element.style.display = "none"; + return this; + }, + attach: function(type, fn) { + if (element.addEventListener) { + element.addEventListener(type, fn, false); + } else if (element.attachEvent) { + element.attachEvent("on" + type, fn); + } + return function() { + qq(element).detach(type, fn); + }; + }, + detach: function(type, fn) { + if (element.removeEventListener) { + element.removeEventListener(type, fn, false); + } else if (element.attachEvent) { + element.detachEvent("on" + type, fn); + } + return this; + }, + contains: function(descendant) { + if (!descendant) { + return false; + } + if (element === descendant) { + return true; + } + if (element.contains) { + return element.contains(descendant); + } else { + return !!(descendant.compareDocumentPosition(element) & 8); + } + }, + insertBefore: function(elementB) { + elementB.parentNode.insertBefore(element, elementB); + return this; + }, + remove: function() { + element.parentNode.removeChild(element); + return this; + }, + css: function(styles) { + if (element.style == null) { + throw new qq.Error("Can't apply style to node as it is not on the HTMLElement prototype chain!"); + } + if (styles.opacity != null) { + if (typeof element.style.opacity !== "string" && typeof element.filters !== "undefined") { + styles.filter = "alpha(opacity=" + Math.round(100 * styles.opacity) + ")"; + } + } + qq.extend(element.style, styles); + return this; + }, + hasClass: function(name, considerParent) { + var re = new RegExp("(^| )" + name + "( |$)"); + return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className)); + }, + addClass: function(name) { + if (!qq(element).hasClass(name)) { + element.className += " " + name; + } + return this; + }, + removeClass: function(name) { + var re = new RegExp("(^| )" + name + "( |$)"); + element.className = element.className.replace(re, " ").replace(/^\s+|\s+$/g, ""); + return this; + }, + getByClass: function(className, first) { + var candidates, result = []; + if (first && element.querySelector) { + return element.querySelector("." + className); + } else if (element.querySelectorAll) { + return element.querySelectorAll("." + className); + } + candidates = element.getElementsByTagName("*"); + qq.each(candidates, function(idx, val) { + if (qq(val).hasClass(className)) { + result.push(val); + } + }); + return first ? result[0] : result; + }, + getFirstByClass: function(className) { + return qq(element).getByClass(className, true); + }, + children: function() { + var children = [], child = element.firstChild; + while (child) { + if (child.nodeType === 1) { + children.push(child); + } + child = child.nextSibling; + } + return children; + }, + setText: function(text) { + element.innerText = text; + element.textContent = text; + return this; + }, + clearText: function() { + return qq(element).setText(""); + }, + hasAttribute: function(attrName) { + var attrVal; + if (element.hasAttribute) { + if (!element.hasAttribute(attrName)) { + return false; + } + return /^false$/i.exec(element.getAttribute(attrName)) == null; + } else { + attrVal = element[attrName]; + if (attrVal === undefined) { + return false; + } + return /^false$/i.exec(attrVal) == null; + } + } + }; + }; + (function() { + "use strict"; + qq.canvasToBlob = function(canvas, mime, quality) { + return qq.dataUriToBlob(canvas.toDataURL(mime, quality)); + }; + qq.dataUriToBlob = function(dataUri) { + var arrayBuffer, byteString, createBlob = function(data, mime) { + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder(); + if (blobBuilder) { + blobBuilder.append(data); + return blobBuilder.getBlob(mime); + } else { + return new Blob([ data ], { + type: mime + }); + } + }, intArray, mimeString; + if (dataUri.split(",")[0].indexOf("base64") >= 0) { + byteString = atob(dataUri.split(",")[1]); + } else { + byteString = decodeURI(dataUri.split(",")[1]); + } + mimeString = dataUri.split(",")[0].split(":")[1].split(";")[0]; + arrayBuffer = new ArrayBuffer(byteString.length); + intArray = new Uint8Array(arrayBuffer); + qq.each(byteString, function(idx, character) { + intArray[idx] = character.charCodeAt(0); + }); + return createBlob(arrayBuffer, mimeString); + }; + qq.log = function(message, level) { + if (window.console) { + if (!level || level === "info") { + window.console.log(message); + } else { + if (window.console[level]) { + window.console[level](message); + } else { + window.console.log("<" + level + "> " + message); + } + } + } + }; + qq.isObject = function(variable) { + return variable && !variable.nodeType && Object.prototype.toString.call(variable) === "[object Object]"; + }; + qq.isFunction = function(variable) { + return typeof variable === "function"; + }; + qq.isArray = function(value) { + return Object.prototype.toString.call(value) === "[object Array]" || value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer; + }; + qq.isItemList = function(maybeItemList) { + return Object.prototype.toString.call(maybeItemList) === "[object DataTransferItemList]"; + }; + qq.isNodeList = function(maybeNodeList) { + return Object.prototype.toString.call(maybeNodeList) === "[object NodeList]" || maybeNodeList.item && maybeNodeList.namedItem; + }; + qq.isString = function(maybeString) { + return Object.prototype.toString.call(maybeString) === "[object String]"; + }; + qq.trimStr = function(string) { + if (String.prototype.trim) { + return string.trim(); + } + return string.replace(/^\s+|\s+$/g, ""); + }; + qq.format = function(str) { + var args = Array.prototype.slice.call(arguments, 1), newStr = str, nextIdxToReplace = newStr.indexOf("{}"); + qq.each(args, function(idx, val) { + var strBefore = newStr.substring(0, nextIdxToReplace), strAfter = newStr.substring(nextIdxToReplace + 2); + newStr = strBefore + val + strAfter; + nextIdxToReplace = newStr.indexOf("{}", nextIdxToReplace + val.length); + if (nextIdxToReplace < 0) { + return false; + } + }); + return newStr; + }; + qq.isFile = function(maybeFile) { + return window.File && Object.prototype.toString.call(maybeFile) === "[object File]"; + }; + qq.isFileList = function(maybeFileList) { + return window.FileList && Object.prototype.toString.call(maybeFileList) === "[object FileList]"; + }; + qq.isFileOrInput = function(maybeFileOrInput) { + return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput); + }; + qq.isInput = function(maybeInput, notFile) { + var evaluateType = function(type) { + var normalizedType = type.toLowerCase(); + if (notFile) { + return normalizedType !== "file"; + } + return normalizedType === "file"; + }; + if (window.HTMLInputElement) { + if (Object.prototype.toString.call(maybeInput) === "[object HTMLInputElement]") { + if (maybeInput.type && evaluateType(maybeInput.type)) { + return true; + } + } + } + if (maybeInput.tagName) { + if (maybeInput.tagName.toLowerCase() === "input") { + if (maybeInput.type && evaluateType(maybeInput.type)) { + return true; + } + } + } + return false; + }; + qq.isBlob = function(maybeBlob) { + if (window.Blob && Object.prototype.toString.call(maybeBlob) === "[object Blob]") { + return true; + } + }; + qq.isXhrUploadSupported = function() { + var input = document.createElement("input"); + input.type = "file"; + return input.multiple !== undefined && typeof File !== "undefined" && typeof FormData !== "undefined" && typeof qq.createXhrInstance().upload !== "undefined"; + }; + qq.createXhrInstance = function() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } + try { + return new ActiveXObject("MSXML2.XMLHTTP.3.0"); + } catch (error) { + qq.log("Neither XHR or ActiveX are supported!", "error"); + return null; + } + }; + qq.isFolderDropSupported = function(dataTransfer) { + return dataTransfer.items && dataTransfer.items.length > 0 && dataTransfer.items[0].webkitGetAsEntry; + }; + qq.isFileChunkingSupported = function() { + return !qq.androidStock() && qq.isXhrUploadSupported() && (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined); + }; + qq.sliceBlob = function(fileOrBlob, start, end) { + var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice; + return slicer.call(fileOrBlob, start, end); + }; + qq.arrayBufferToHex = function(buffer) { + var bytesAsHex = "", bytes = new Uint8Array(buffer); + qq.each(bytes, function(idx, byt) { + var byteAsHexStr = byt.toString(16); + if (byteAsHexStr.length < 2) { + byteAsHexStr = "0" + byteAsHexStr; + } + bytesAsHex += byteAsHexStr; + }); + return bytesAsHex; + }; + qq.readBlobToHex = function(blob, startOffset, length) { + var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length), fileReader = new FileReader(), promise = new qq.Promise(); + fileReader.onload = function() { + promise.success(qq.arrayBufferToHex(fileReader.result)); + }; + fileReader.onerror = promise.failure; + fileReader.readAsArrayBuffer(initialBlob); + return promise; + }; + qq.extend = function(first, second, extendNested) { + qq.each(second, function(prop, val) { + if (extendNested && qq.isObject(val)) { + if (first[prop] === undefined) { + first[prop] = {}; + } + qq.extend(first[prop], val, true); + } else { + first[prop] = val; + } + }); + return first; + }; + qq.override = function(target, sourceFn) { + var super_ = {}, source = sourceFn(super_); + qq.each(source, function(srcPropName, srcPropVal) { + if (target[srcPropName] !== undefined) { + super_[srcPropName] = target[srcPropName]; + } + target[srcPropName] = srcPropVal; + }); + return target; + }; + qq.indexOf = function(arr, elt, from) { + if (arr.indexOf) { + return arr.indexOf(elt, from); + } + from = from || 0; + var len = arr.length; + if (from < 0) { + from += len; + } + for (;from < len; from += 1) { + if (arr.hasOwnProperty(from) && arr[from] === elt) { + return from; + } + } + return -1; + }; + qq.getUniqueId = function() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8; + return v.toString(16); + }); + }; + qq.ie = function() { + return navigator.userAgent.indexOf("MSIE") !== -1 || navigator.userAgent.indexOf("Trident") !== -1; + }; + qq.ie7 = function() { + return navigator.userAgent.indexOf("MSIE 7") !== -1; + }; + qq.ie8 = function() { + return navigator.userAgent.indexOf("MSIE 8") !== -1; + }; + qq.ie10 = function() { + return navigator.userAgent.indexOf("MSIE 10") !== -1; + }; + qq.ie11 = function() { + return qq.ie() && navigator.userAgent.indexOf("rv:11") !== -1; + }; + qq.edge = function() { + return navigator.userAgent.indexOf("Edge") >= 0; + }; + qq.safari = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Apple") !== -1; + }; + qq.chrome = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Google") !== -1; + }; + qq.opera = function() { + return navigator.vendor !== undefined && navigator.vendor.indexOf("Opera") !== -1; + }; + qq.firefox = function() { + return !qq.edge() && !qq.ie11() && navigator.userAgent.indexOf("Mozilla") !== -1 && navigator.vendor !== undefined && navigator.vendor === ""; + }; + qq.windows = function() { + return navigator.platform === "Win32"; + }; + qq.android = function() { + return navigator.userAgent.toLowerCase().indexOf("android") !== -1; + }; + qq.androidStock = function() { + return qq.android() && navigator.userAgent.toLowerCase().indexOf("chrome") < 0; + }; + qq.ios6 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 6_") !== -1; + }; + qq.ios7 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 7_") !== -1; + }; + qq.ios8 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 8_") !== -1; + }; + qq.ios800 = function() { + return qq.ios() && navigator.userAgent.indexOf(" OS 8_0 ") !== -1; + }; + qq.ios = function() { + return navigator.userAgent.indexOf("iPad") !== -1 || navigator.userAgent.indexOf("iPod") !== -1 || navigator.userAgent.indexOf("iPhone") !== -1; + }; + qq.iosChrome = function() { + return qq.ios() && navigator.userAgent.indexOf("CriOS") !== -1; + }; + qq.iosSafari = function() { + return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf("Safari") !== -1; + }; + qq.iosSafariWebView = function() { + return qq.ios() && !qq.iosChrome() && !qq.iosSafari(); + }; + qq.preventDefault = function(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + }; + qq.toElement = function() { + var div = document.createElement("div"); + return function(html) { + div.innerHTML = html; + var element = div.firstChild; + div.removeChild(element); + return element; + }; + }(); + qq.each = function(iterableItem, callback) { + var keyOrIndex, retVal; + if (iterableItem) { + if (window.Storage && iterableItem.constructor === window.Storage) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex))); + if (retVal === false) { + break; + } + } + } else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); + if (retVal === false) { + break; + } + } + } else if (qq.isString(iterableItem)) { + for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { + retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex)); + if (retVal === false) { + break; + } + } + } else { + for (keyOrIndex in iterableItem) { + if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) { + retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); + if (retVal === false) { + break; + } + } + } + } + } + }; + qq.bind = function(oldFunc, context) { + if (qq.isFunction(oldFunc)) { + var args = Array.prototype.slice.call(arguments, 2); + return function() { + var newArgs = qq.extend([], args); + if (arguments.length) { + newArgs = newArgs.concat(Array.prototype.slice.call(arguments)); + } + return oldFunc.apply(context, newArgs); + }; + } + throw new Error("first parameter must be a function!"); + }; + qq.obj2url = function(obj, temp, prefixDone) { + var uristrings = [], prefix = "&", add = function(nextObj, i) { + var nextTemp = temp ? /\[\]$/.test(temp) ? temp : temp + "[" + i + "]" : i; + if (nextTemp !== "undefined" && i !== "undefined") { + uristrings.push(typeof nextObj === "object" ? qq.obj2url(nextObj, nextTemp, true) : Object.prototype.toString.call(nextObj) === "[object Function]" ? encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj()) : encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj)); + } + }; + if (!prefixDone && temp) { + prefix = /\?/.test(temp) ? /\?$/.test(temp) ? "" : "&" : "?"; + uristrings.push(temp); + uristrings.push(qq.obj2url(obj)); + } else if (Object.prototype.toString.call(obj) === "[object Array]" && typeof obj !== "undefined") { + qq.each(obj, function(idx, val) { + add(val, idx); + }); + } else if (typeof obj !== "undefined" && obj !== null && typeof obj === "object") { + qq.each(obj, function(prop, val) { + add(val, prop); + }); + } else { + uristrings.push(encodeURIComponent(temp) + "=" + encodeURIComponent(obj)); + } + if (temp) { + return uristrings.join(prefix); + } else { + return uristrings.join(prefix).replace(/^&/, "").replace(/%20/g, "+"); + } + }; + qq.obj2FormData = function(obj, formData, arrayKeyName) { + if (!formData) { + formData = new FormData(); + } + qq.each(obj, function(key, val) { + key = arrayKeyName ? arrayKeyName + "[" + key + "]" : key; + if (qq.isObject(val)) { + qq.obj2FormData(val, formData, key); + } else if (qq.isFunction(val)) { + formData.append(key, val()); + } else { + formData.append(key, val); + } + }); + return formData; + }; + qq.obj2Inputs = function(obj, form) { + var input; + if (!form) { + form = document.createElement("form"); + } + qq.obj2FormData(obj, { + append: function(key, val) { + input = document.createElement("input"); + input.setAttribute("name", key); + input.setAttribute("value", val); + form.appendChild(input); + } + }); + return form; + }; + qq.parseJson = function(json) { + if (window.JSON && qq.isFunction(JSON.parse)) { + return JSON.parse(json); + } else { + return eval("(" + json + ")"); + } + }; + qq.getExtension = function(filename) { + var extIdx = filename.lastIndexOf(".") + 1; + if (extIdx > 0) { + return filename.substr(extIdx, filename.length - extIdx); + } + }; + qq.getFilename = function(blobOrFileInput) { + if (qq.isInput(blobOrFileInput)) { + return blobOrFileInput.value.replace(/.*(\/|\\)/, ""); + } else if (qq.isFile(blobOrFileInput)) { + if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) { + return blobOrFileInput.fileName; + } + } + return blobOrFileInput.name; + }; + qq.DisposeSupport = function() { + var disposers = []; + return { + dispose: function() { + var disposer; + do { + disposer = disposers.shift(); + if (disposer) { + disposer(); + } + } while (disposer); + }, + attach: function() { + var args = arguments; + this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1))); + }, + addDisposer: function(disposeFunction) { + disposers.push(disposeFunction); + } + }; + }; + })(); + (function() { + "use strict"; + if (typeof define === "function" && define.amd) { + define(function() { + return qq; + }); + } else if (typeof module !== "undefined" && module.exports) { + module.exports = qq; + } else { + global.qq = qq; + } + })(); + (function() { + "use strict"; + qq.Error = function(message) { + this.message = "[Fine Uploader " + qq.version + "] " + message; + }; + qq.Error.prototype = new Error(); + })(); + qq.version = "5.16.2"; + qq.supportedFeatures = function() { + "use strict"; + var supportsUploading, supportsUploadingBlobs, supportsFileDrop, supportsAjaxFileUploading, supportsFolderDrop, supportsChunking, supportsResume, supportsUploadViaPaste, supportsUploadCors, supportsDeleteFileXdr, supportsDeleteFileCorsXhr, supportsDeleteFileCors, supportsFolderSelection, supportsImagePreviews, supportsUploadProgress; + function testSupportsFileInputElement() { + var supported = true, tempInput; + try { + tempInput = document.createElement("input"); + tempInput.type = "file"; + qq(tempInput).hide(); + if (tempInput.disabled) { + supported = false; + } + } catch (ex) { + supported = false; + } + return supported; + } + function isChrome14OrHigher() { + return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\/[1][4-9]|Chrome\/[2-9][0-9]/) !== undefined; + } + function isCrossOriginXhrSupported() { + if (window.XMLHttpRequest) { + var xhr = qq.createXhrInstance(); + return xhr.withCredentials !== undefined; + } + return false; + } + function isXdrSupported() { + return window.XDomainRequest !== undefined; + } + function isCrossOriginAjaxSupported() { + if (isCrossOriginXhrSupported()) { + return true; + } + return isXdrSupported(); + } + function isFolderSelectionSupported() { + return document.createElement("input").webkitdirectory !== undefined; + } + function isLocalStorageSupported() { + try { + return !!window.localStorage && qq.isFunction(window.localStorage.setItem); + } catch (error) { + return false; + } + } + function isDragAndDropSupported() { + var span = document.createElement("span"); + return ("draggable" in span || "ondragstart" in span && "ondrop" in span) && !qq.android() && !qq.ios(); + } + supportsUploading = testSupportsFileInputElement(); + supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported(); + supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock(); + supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported(); + supportsFolderDrop = supportsFileDrop && function() { + var input = document.createElement("input"); + input.type = "file"; + return !!("webkitdirectory" in (input || document.querySelectorAll("input[type=file]")[0])); + }(); + supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported(); + supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported(); + supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher(); + supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading); + supportsDeleteFileCorsXhr = isCrossOriginXhrSupported(); + supportsDeleteFileXdr = isXdrSupported(); + supportsDeleteFileCors = isCrossOriginAjaxSupported(); + supportsFolderSelection = isFolderSelectionSupported(); + supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined; + supportsUploadProgress = function() { + if (supportsAjaxFileUploading) { + return !qq.androidStock() && !qq.iosChrome(); + } + return false; + }(); + return { + ajaxUploading: supportsAjaxFileUploading, + blobUploading: supportsUploadingBlobs, + canDetermineSize: supportsAjaxFileUploading, + chunking: supportsChunking, + deleteFileCors: supportsDeleteFileCors, + deleteFileCorsXdr: supportsDeleteFileXdr, + deleteFileCorsXhr: supportsDeleteFileCorsXhr, + dialogElement: !!window.HTMLDialogElement, + fileDrop: supportsFileDrop, + folderDrop: supportsFolderDrop, + folderSelection: supportsFolderSelection, + imagePreviews: supportsImagePreviews, + imageValidation: supportsImagePreviews, + itemSizeValidation: supportsAjaxFileUploading, + pause: supportsChunking, + progressBar: supportsUploadProgress, + resume: supportsResume, + scaling: supportsImagePreviews && supportsUploadingBlobs, + tiffPreviews: qq.safari(), + unlimitedScaledImageSize: !qq.ios(), + uploading: supportsUploading, + uploadCors: supportsUploadCors, + uploadCustomHeaders: supportsAjaxFileUploading, + uploadNonMultipart: supportsAjaxFileUploading, + uploadViaPaste: supportsUploadViaPaste + }; + }(); + qq.isGenericPromise = function(maybePromise) { + "use strict"; + return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then)); + }; + qq.Promise = function() { + "use strict"; + var successArgs, failureArgs, successCallbacks = [], failureCallbacks = [], doneCallbacks = [], state = 0; + qq.extend(this, { + then: function(onSuccess, onFailure) { + if (state === 0) { + if (onSuccess) { + successCallbacks.push(onSuccess); + } + if (onFailure) { + failureCallbacks.push(onFailure); + } + } else if (state === -1) { + onFailure && onFailure.apply(null, failureArgs); + } else if (onSuccess) { + onSuccess.apply(null, successArgs); + } + return this; + }, + done: function(callback) { + if (state === 0) { + doneCallbacks.push(callback); + } else { + callback.apply(null, failureArgs === undefined ? successArgs : failureArgs); + } + return this; + }, + success: function() { + state = 1; + successArgs = arguments; + if (successCallbacks.length) { + qq.each(successCallbacks, function(idx, callback) { + callback.apply(null, successArgs); + }); + } + if (doneCallbacks.length) { + qq.each(doneCallbacks, function(idx, callback) { + callback.apply(null, successArgs); + }); + } + return this; + }, + failure: function() { + state = -1; + failureArgs = arguments; + if (failureCallbacks.length) { + qq.each(failureCallbacks, function(idx, callback) { + callback.apply(null, failureArgs); + }); + } + if (doneCallbacks.length) { + qq.each(doneCallbacks, function(idx, callback) { + callback.apply(null, failureArgs); + }); + } + return this; + } + }); + }; + qq.BlobProxy = function(referenceBlob, onCreate) { + "use strict"; + qq.extend(this, { + referenceBlob: referenceBlob, + create: function() { + return onCreate(referenceBlob); + } + }); + }; + qq.UploadButton = function(o) { + "use strict"; + var self = this, disposeSupport = new qq.DisposeSupport(), options = { + acceptFiles: null, + element: null, + focusClass: "qq-upload-button-focus", + folders: false, + hoverClass: "qq-upload-button-hover", + ios8BrowserCrashWorkaround: false, + multiple: false, + name: "qqfile", + onChange: function(input) {}, + title: null + }, input, buttonId; + qq.extend(options, o); + buttonId = qq.getUniqueId(); + function createInput() { + var input = document.createElement("input"); + input.setAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME, buttonId); + input.setAttribute("title", options.title); + self.setMultiple(options.multiple, input); + if (options.folders && qq.supportedFeatures.folderSelection) { + input.setAttribute("webkitdirectory", ""); + } + if (options.acceptFiles) { + input.setAttribute("accept", options.acceptFiles); + } + input.setAttribute("type", "file"); + input.setAttribute("name", options.name); + qq(input).css({ + position: "absolute", + right: 0, + top: 0, + fontFamily: "Arial", + fontSize: qq.ie() && !qq.ie8() ? "3500px" : "118px", + margin: 0, + padding: 0, + cursor: "pointer", + opacity: 0 + }); + !qq.ie7() && qq(input).css({ + height: "100%" + }); + options.element.appendChild(input); + disposeSupport.attach(input, "change", function() { + options.onChange(input); + }); + disposeSupport.attach(input, "mouseover", function() { + qq(options.element).addClass(options.hoverClass); + }); + disposeSupport.attach(input, "mouseout", function() { + qq(options.element).removeClass(options.hoverClass); + }); + disposeSupport.attach(input, "focus", function() { + qq(options.element).addClass(options.focusClass); + }); + disposeSupport.attach(input, "blur", function() { + qq(options.element).removeClass(options.focusClass); + }); + return input; + } + qq(options.element).css({ + position: "relative", + overflow: "hidden", + direction: "ltr" + }); + qq.extend(this, { + getInput: function() { + return input; + }, + getButtonId: function() { + return buttonId; + }, + setMultiple: function(isMultiple, optInput) { + var input = optInput || this.getInput(); + if (options.ios8BrowserCrashWorkaround && qq.ios8() && (qq.iosChrome() || qq.iosSafariWebView())) { + input.setAttribute("multiple", ""); + } else { + if (isMultiple) { + input.setAttribute("multiple", ""); + } else { + input.removeAttribute("multiple"); + } + } + }, + setAcceptFiles: function(acceptFiles) { + if (acceptFiles !== options.acceptFiles) { + input.setAttribute("accept", acceptFiles); + } + }, + reset: function() { + if (input.parentNode) { + qq(input).remove(); + } + qq(options.element).removeClass(options.focusClass); + input = null; + input = createInput(); + } + }); + input = createInput(); + }; + qq.UploadButton.BUTTON_ID_ATTR_NAME = "qq-button-id"; + qq.UploadData = function(uploaderProxy) { + "use strict"; + var data = [], byUuid = {}, byStatus = {}, byProxyGroupId = {}, byBatchId = {}; + function getDataByIds(idOrIds) { + if (qq.isArray(idOrIds)) { + var entries = []; + qq.each(idOrIds, function(idx, id) { + entries.push(data[id]); + }); + return entries; + } + return data[idOrIds]; + } + function getDataByUuids(uuids) { + if (qq.isArray(uuids)) { + var entries = []; + qq.each(uuids, function(idx, uuid) { + entries.push(data[byUuid[uuid]]); + }); + return entries; + } + return data[byUuid[uuids]]; + } + function getDataByStatus(status) { + var statusResults = [], statuses = [].concat(status); + qq.each(statuses, function(index, statusEnum) { + var statusResultIndexes = byStatus[statusEnum]; + if (statusResultIndexes !== undefined) { + qq.each(statusResultIndexes, function(i, dataIndex) { + statusResults.push(data[dataIndex]); + }); + } + }); + return statusResults; + } + qq.extend(this, { + addFile: function(spec) { + var status = spec.status || qq.status.SUBMITTING, id = data.push({ + name: spec.name, + originalName: spec.name, + uuid: spec.uuid, + size: spec.size == null ? -1 : spec.size, + status: status, + file: spec.file + }) - 1; + if (spec.batchId) { + data[id].batchId = spec.batchId; + if (byBatchId[spec.batchId] === undefined) { + byBatchId[spec.batchId] = []; + } + byBatchId[spec.batchId].push(id); + } + if (spec.proxyGroupId) { + data[id].proxyGroupId = spec.proxyGroupId; + if (byProxyGroupId[spec.proxyGroupId] === undefined) { + byProxyGroupId[spec.proxyGroupId] = []; + } + byProxyGroupId[spec.proxyGroupId].push(id); + } + data[id].id = id; + byUuid[spec.uuid] = id; + if (byStatus[status] === undefined) { + byStatus[status] = []; + } + byStatus[status].push(id); + spec.onBeforeStatusChange && spec.onBeforeStatusChange(id); + uploaderProxy.onStatusChange(id, null, status); + return id; + }, + retrieve: function(optionalFilter) { + if (qq.isObject(optionalFilter) && data.length) { + if (optionalFilter.id !== undefined) { + return getDataByIds(optionalFilter.id); + } else if (optionalFilter.uuid !== undefined) { + return getDataByUuids(optionalFilter.uuid); + } else if (optionalFilter.status) { + return getDataByStatus(optionalFilter.status); + } + } else { + return qq.extend([], data, true); + } + }, + removeFileRef: function(id) { + var record = getDataByIds(id); + if (record) { + delete record.file; + } + }, + reset: function() { + data = []; + byUuid = {}; + byStatus = {}; + byBatchId = {}; + }, + setStatus: function(id, newStatus) { + var oldStatus = data[id].status, byStatusOldStatusIndex = qq.indexOf(byStatus[oldStatus], id); + byStatus[oldStatus].splice(byStatusOldStatusIndex, 1); + data[id].status = newStatus; + if (byStatus[newStatus] === undefined) { + byStatus[newStatus] = []; + } + byStatus[newStatus].push(id); + uploaderProxy.onStatusChange(id, oldStatus, newStatus); + }, + uuidChanged: function(id, newUuid) { + var oldUuid = data[id].uuid; + data[id].uuid = newUuid; + byUuid[newUuid] = id; + delete byUuid[oldUuid]; + }, + updateName: function(id, newName) { + data[id].name = newName; + }, + updateSize: function(id, newSize) { + data[id].size = newSize; + }, + setParentId: function(targetId, parentId) { + data[targetId].parentId = parentId; + }, + getIdsInProxyGroup: function(id) { + var proxyGroupId = data[id].proxyGroupId; + if (proxyGroupId) { + return byProxyGroupId[proxyGroupId]; + } + return []; + }, + getIdsInBatch: function(id) { + var batchId = data[id].batchId; + return byBatchId[batchId]; + } + }); + }; + qq.status = { + SUBMITTING: "submitting", + SUBMITTED: "submitted", + REJECTED: "rejected", + QUEUED: "queued", + CANCELED: "canceled", + PAUSED: "paused", + UPLOADING: "uploading", + UPLOAD_FINALIZING: "upload finalizing", + UPLOAD_RETRYING: "retrying upload", + UPLOAD_SUCCESSFUL: "upload successful", + UPLOAD_FAILED: "upload failed", + DELETE_FAILED: "delete failed", + DELETING: "deleting", + DELETED: "deleted" + }; + (function() { + "use strict"; + qq.basePublicApi = { + addBlobs: function(blobDataOrArray, params, endpoint) { + this.addFiles(blobDataOrArray, params, endpoint); + }, + addInitialFiles: function(cannedFileList) { + var self = this; + qq.each(cannedFileList, function(index, cannedFile) { + self._addCannedFile(cannedFile); + }); + }, + addFiles: function(data, params, endpoint) { + this._maybeHandleIos8SafariWorkaround(); + var batchId = this._storedIds.length === 0 ? qq.getUniqueId() : this._currentBatchId, processBlob = qq.bind(function(blob) { + this._handleNewFile({ + blob: blob, + name: this._options.blobs.defaultName + }, batchId, verifiedFiles); + }, this), processBlobData = qq.bind(function(blobData) { + this._handleNewFile(blobData, batchId, verifiedFiles); + }, this), processCanvas = qq.bind(function(canvas) { + var blob = qq.canvasToBlob(canvas); + this._handleNewFile({ + blob: blob, + name: this._options.blobs.defaultName + ".png" + }, batchId, verifiedFiles); + }, this), processCanvasData = qq.bind(function(canvasData) { + var normalizedQuality = canvasData.quality && canvasData.quality / 100, blob = qq.canvasToBlob(canvasData.canvas, canvasData.type, normalizedQuality); + this._handleNewFile({ + blob: blob, + name: canvasData.name + }, batchId, verifiedFiles); + }, this), processFileOrInput = qq.bind(function(fileOrInput) { + if (qq.isInput(fileOrInput) && qq.supportedFeatures.ajaxUploading) { + var files = Array.prototype.slice.call(fileOrInput.files), self = this; + qq.each(files, function(idx, file) { + self._handleNewFile(file, batchId, verifiedFiles); + }); + } else { + this._handleNewFile(fileOrInput, batchId, verifiedFiles); + } + }, this), normalizeData = function() { + if (qq.isFileList(data)) { + data = Array.prototype.slice.call(data); + } + data = [].concat(data); + }, self = this, verifiedFiles = []; + this._currentBatchId = batchId; + if (data) { + normalizeData(); + qq.each(data, function(idx, fileContainer) { + if (qq.isFileOrInput(fileContainer)) { + processFileOrInput(fileContainer); + } else if (qq.isBlob(fileContainer)) { + processBlob(fileContainer); + } else if (qq.isObject(fileContainer)) { + if (fileContainer.blob && fileContainer.name) { + processBlobData(fileContainer); + } else if (fileContainer.canvas && fileContainer.name) { + processCanvasData(fileContainer); + } + } else if (fileContainer.tagName && fileContainer.tagName.toLowerCase() === "canvas") { + processCanvas(fileContainer); + } else { + self.log(fileContainer + " is not a valid file container! Ignoring!", "warn"); + } + }); + this.log("Received " + verifiedFiles.length + " files."); + this._prepareItemsForUpload(verifiedFiles, params, endpoint); + } + }, + cancel: function(id) { + var uploadData = this._uploadData.retrieve({ + id: id + }); + if (uploadData && uploadData.status === qq.status.UPLOAD_FINALIZING) { + this.log(qq.format("Ignoring cancel for file ID {} ({}). Finalizing upload.", id, this.getName(id)), "error"); + } else { + this._handler.cancel(id); + } + }, + cancelAll: function() { + var storedIdsCopy = [], self = this; + qq.extend(storedIdsCopy, this._storedIds); + qq.each(storedIdsCopy, function(idx, storedFileId) { + self.cancel(storedFileId); + }); + this._handler.cancelAll(); + }, + clearStoredFiles: function() { + this._storedIds = []; + }, + continueUpload: function(id) { + var uploadData = this._uploadData.retrieve({ + id: id + }); + if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) { + return false; + } + if (uploadData.status === qq.status.PAUSED) { + this.log(qq.format("Paused file ID {} ({}) will be continued. Not paused.", id, this.getName(id))); + this._uploadFile(id); + return true; + } else { + this.log(qq.format("Ignoring continue for file ID {} ({}). Not paused.", id, this.getName(id)), "error"); + } + return false; + }, + deleteFile: function(id) { + return this._onSubmitDelete(id); + }, + doesExist: function(fileOrBlobId) { + return this._handler.isValid(fileOrBlobId); + }, + drawThumbnail: function(fileId, imgOrCanvas, maxSize, fromServer, customResizeFunction) { + var promiseToReturn = new qq.Promise(), fileOrUrl, options; + if (this._imageGenerator) { + fileOrUrl = this._thumbnailUrls[fileId]; + options = { + customResizeFunction: customResizeFunction, + maxSize: maxSize > 0 ? maxSize : null, + scale: maxSize > 0 + }; + if (!fromServer && qq.supportedFeatures.imagePreviews) { + fileOrUrl = this.getFile(fileId); + } + if (fileOrUrl == null) { + promiseToReturn.failure({ + container: imgOrCanvas, + error: "File or URL not found." + }); + } else { + this._imageGenerator.generate(fileOrUrl, imgOrCanvas, options).then(function success(modifiedContainer) { + promiseToReturn.success(modifiedContainer); + }, function failure(container, reason) { + promiseToReturn.failure({ + container: container, + error: reason || "Problem generating thumbnail" + }); + }); + } + } else { + promiseToReturn.failure({ + container: imgOrCanvas, + error: "Missing image generator module" + }); + } + return promiseToReturn; + }, + getButton: function(fileId) { + return this._getButton(this._buttonIdsForFileIds[fileId]); + }, + getEndpoint: function(fileId) { + return this._endpointStore.get(fileId); + }, + getFile: function(fileOrBlobId) { + var file = this._handler.getFile(fileOrBlobId); + var uploadDataRecord; + if (!file) { + uploadDataRecord = this._uploadData.retrieve({ + id: fileOrBlobId + }); + if (uploadDataRecord) { + file = uploadDataRecord.file; + } + } + return file || null; + }, + getInProgress: function() { + return this._uploadData.retrieve({ + status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED ] + }).length; + }, + getName: function(id) { + return this._uploadData.retrieve({ + id: id + }).name; + }, + getParentId: function(id) { + var uploadDataEntry = this.getUploads({ + id: id + }), parentId = null; + if (uploadDataEntry) { + if (uploadDataEntry.parentId !== undefined) { + parentId = uploadDataEntry.parentId; + } + } + return parentId; + }, + getResumableFilesData: function() { + return this._handler.getResumableFilesData(); + }, + getSize: function(id) { + return this._uploadData.retrieve({ + id: id + }).size; + }, + getNetUploads: function() { + return this._netUploaded; + }, + getRemainingAllowedItems: function() { + var allowedItems = this._currentItemLimit; + if (allowedItems > 0) { + return allowedItems - this._netUploadedOrQueued; + } + return null; + }, + getUploads: function(optionalFilter) { + return this._uploadData.retrieve(optionalFilter); + }, + getUuid: function(id) { + return this._uploadData.retrieve({ + id: id + }).uuid; + }, + isResumable: function(id) { + return this._handler.hasResumeRecord(id); + }, + log: function(str, level) { + if (this._options.debug && (!level || level === "info")) { + qq.log("[Fine Uploader " + qq.version + "] " + str); + } else if (level && level !== "info") { + qq.log("[Fine Uploader " + qq.version + "] " + str, level); + } + }, + pauseUpload: function(id) { + var uploadData = this._uploadData.retrieve({ + id: id + }); + if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) { + return false; + } + if (qq.indexOf([ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING ], uploadData.status) >= 0) { + if (this._handler.pause(id)) { + this._uploadData.setStatus(id, qq.status.PAUSED); + return true; + } else { + this.log(qq.format("Unable to pause file ID {} ({}).", id, this.getName(id)), "error"); + } + } else { + this.log(qq.format("Ignoring pause for file ID {} ({}). Not in progress.", id, this.getName(id)), "error"); + } + return false; + }, + removeFileRef: function(id) { + this._handler.expunge(id); + this._uploadData.removeFileRef(id); + }, + reset: function() { + this.log("Resetting uploader..."); + this._handler.reset(); + this._storedIds = []; + this._autoRetries = []; + this._retryTimeouts = []; + this._preventRetries = []; + this._thumbnailUrls = []; + qq.each(this._buttons, function(idx, button) { + button.reset(); + }); + this._paramsStore.reset(); + this._endpointStore.reset(); + this._netUploadedOrQueued = 0; + this._netUploaded = 0; + this._uploadData.reset(); + this._buttonIdsForFileIds = []; + this._pasteHandler && this._pasteHandler.reset(); + this._options.session.refreshOnReset && this._refreshSessionData(); + this._succeededSinceLastAllComplete = []; + this._failedSinceLastAllComplete = []; + this._totalProgress && this._totalProgress.reset(); + this._customResumeDataStore.reset(); + }, + retry: function(id) { + return this._manualRetry(id); + }, + scaleImage: function(id, specs) { + var self = this; + return qq.Scaler.prototype.scaleImage(id, specs, { + log: qq.bind(self.log, self), + getFile: qq.bind(self.getFile, self), + uploadData: self._uploadData + }); + }, + setCustomHeaders: function(headers, id) { + this._customHeadersStore.set(headers, id); + }, + setCustomResumeData: function(id, data) { + this._customResumeDataStore.set(data, id); + }, + setDeleteFileCustomHeaders: function(headers, id) { + this._deleteFileCustomHeadersStore.set(headers, id); + }, + setDeleteFileEndpoint: function(endpoint, id) { + this._deleteFileEndpointStore.set(endpoint, id); + }, + setDeleteFileParams: function(params, id) { + this._deleteFileParamsStore.set(params, id); + }, + setEndpoint: function(endpoint, id) { + this._endpointStore.set(endpoint, id); + }, + setForm: function(elementOrId) { + this._updateFormSupportAndParams(elementOrId); + }, + setItemLimit: function(newItemLimit) { + this._currentItemLimit = newItemLimit; + }, + setName: function(id, newName) { + this._uploadData.updateName(id, newName); + }, + setParams: function(params, id) { + this._paramsStore.set(params, id); + }, + setUuid: function(id, newUuid) { + return this._uploadData.uuidChanged(id, newUuid); + }, + setStatus: function(id, newStatus) { + var fileRecord = this.getUploads({ + id: id + }); + if (!fileRecord) { + throw new qq.Error(id + " is not a valid file ID."); + } + switch (newStatus) { + case qq.status.DELETED: + this._onDeleteComplete(id, null, false); + break; + + case qq.status.DELETE_FAILED: + this._onDeleteComplete(id, null, true); + break; + + default: + var errorMessage = "Method setStatus called on '" + name + "' not implemented yet for " + newStatus; + this.log(errorMessage); + throw new qq.Error(errorMessage); + } + }, + uploadStoredFiles: function() { + if (this._storedIds.length === 0) { + this._itemError("noFilesError"); + } else { + this._uploadStoredFiles(); + } + } + }; + qq.basePrivateApi = { + _addCannedFile: function(sessionData) { + var self = this; + return this._uploadData.addFile({ + uuid: sessionData.uuid, + name: sessionData.name, + size: sessionData.size, + status: qq.status.UPLOAD_SUCCESSFUL, + onBeforeStatusChange: function(id) { + sessionData.deleteFileEndpoint && self.setDeleteFileEndpoint(sessionData.deleteFileEndpoint, id); + sessionData.deleteFileParams && self.setDeleteFileParams(sessionData.deleteFileParams, id); + if (sessionData.thumbnailUrl) { + self._thumbnailUrls[id] = sessionData.thumbnailUrl; + } + self._netUploaded++; + self._netUploadedOrQueued++; + } + }); + }, + _annotateWithButtonId: function(file, associatedInput) { + if (qq.isFile(file)) { + file.qqButtonId = this._getButtonId(associatedInput); + } + }, + _batchError: function(message) { + this._options.callbacks.onError(null, null, message, undefined); + }, + _createDeleteHandler: function() { + var self = this; + return new qq.DeleteFileAjaxRequester({ + method: this._options.deleteFile.method.toUpperCase(), + maxConnections: this._options.maxConnections, + uuidParamName: this._options.request.uuidName, + customHeaders: this._deleteFileCustomHeadersStore, + paramsStore: this._deleteFileParamsStore, + endpointStore: this._deleteFileEndpointStore, + cors: this._options.cors, + log: qq.bind(self.log, self), + onDelete: function(id) { + self._onDelete(id); + self._options.callbacks.onDelete(id); + }, + onDeleteComplete: function(id, xhrOrXdr, isError) { + self._onDeleteComplete(id, xhrOrXdr, isError); + self._options.callbacks.onDeleteComplete(id, xhrOrXdr, isError); + } + }); + }, + _createPasteHandler: function() { + var self = this; + return new qq.PasteSupport({ + targetElement: this._options.paste.targetElement, + callbacks: { + log: qq.bind(self.log, self), + pasteReceived: function(blob) { + self._handleCheckedCallback({ + name: "onPasteReceived", + callback: qq.bind(self._options.callbacks.onPasteReceived, self, blob), + onSuccess: qq.bind(self._handlePasteSuccess, self, blob), + identifier: "pasted image" + }); + } + } + }); + }, + _createStore: function(initialValue, _readOnlyValues_) { + var store = {}, catchall = initialValue, perIdReadOnlyValues = {}, readOnlyValues = _readOnlyValues_, copy = function(orig) { + if (qq.isObject(orig)) { + return qq.extend({}, orig); + } + return orig; + }, getReadOnlyValues = function() { + if (qq.isFunction(readOnlyValues)) { + return readOnlyValues(); + } + return readOnlyValues; + }, includeReadOnlyValues = function(id, existing) { + if (readOnlyValues && qq.isObject(existing)) { + qq.extend(existing, getReadOnlyValues()); + } + if (perIdReadOnlyValues[id]) { + qq.extend(existing, perIdReadOnlyValues[id]); + } + }; + return { + set: function(val, id) { + if (id == null) { + store = {}; + catchall = copy(val); + } else { + store[id] = copy(val); + } + }, + get: function(id) { + var values; + if (id != null && store[id]) { + values = store[id]; + } else { + values = copy(catchall); + } + includeReadOnlyValues(id, values); + return copy(values); + }, + addReadOnly: function(id, values) { + if (qq.isObject(store)) { + if (id === null) { + if (qq.isFunction(values)) { + readOnlyValues = values; + } else { + readOnlyValues = readOnlyValues || {}; + qq.extend(readOnlyValues, values); + } + } else { + perIdReadOnlyValues[id] = perIdReadOnlyValues[id] || {}; + qq.extend(perIdReadOnlyValues[id], values); + } + } + }, + remove: function(fileId) { + return delete store[fileId]; + }, + reset: function() { + store = {}; + perIdReadOnlyValues = {}; + catchall = initialValue; + } + }; + }, + _createUploadDataTracker: function() { + var self = this; + return new qq.UploadData({ + getName: function(id) { + return self.getName(id); + }, + getUuid: function(id) { + return self.getUuid(id); + }, + getSize: function(id) { + return self.getSize(id); + }, + onStatusChange: function(id, oldStatus, newStatus) { + self._onUploadStatusChange(id, oldStatus, newStatus); + self._options.callbacks.onStatusChange(id, oldStatus, newStatus); + self._maybeAllComplete(id, newStatus); + if (self._totalProgress) { + setTimeout(function() { + self._totalProgress.onStatusChange(id, oldStatus, newStatus); + }, 0); + } + } + }); + }, + _createUploadButton: function(spec) { + var self = this, acceptFiles = spec.accept || this._options.validation.acceptFiles, allowedExtensions = spec.allowedExtensions || this._options.validation.allowedExtensions, button; + function allowMultiple() { + if (qq.supportedFeatures.ajaxUploading) { + if (self._options.workarounds.iosEmptyVideos && qq.ios() && !qq.ios6() && self._isAllowedExtension(allowedExtensions, ".mov")) { + return false; + } + if (spec.multiple === undefined) { + return self._options.multiple; + } + return spec.multiple; + } + return false; + } + button = new qq.UploadButton({ + acceptFiles: acceptFiles, + element: spec.element, + focusClass: this._options.classes.buttonFocus, + folders: spec.folders, + hoverClass: this._options.classes.buttonHover, + ios8BrowserCrashWorkaround: this._options.workarounds.ios8BrowserCrash, + multiple: allowMultiple(), + name: this._options.request.inputName, + onChange: function(input) { + self._onInputChange(input); + }, + title: spec.title == null ? this._options.text.fileInputTitle : spec.title + }); + this._disposeSupport.addDisposer(function() { + button.dispose(); + }); + self._buttons.push(button); + return button; + }, + _createUploadHandler: function(additionalOptions, namespace) { + var self = this, lastOnProgress = {}, options = { + debug: this._options.debug, + maxConnections: this._options.maxConnections, + cors: this._options.cors, + paramsStore: this._paramsStore, + endpointStore: this._endpointStore, + chunking: this._options.chunking, + resume: this._options.resume, + blobs: this._options.blobs, + log: qq.bind(self.log, self), + preventRetryParam: this._options.retry.preventRetryResponseProperty, + onProgress: function(id, name, loaded, total) { + if (loaded < 0 || total < 0) { + return; + } + if (lastOnProgress[id]) { + if (lastOnProgress[id].loaded !== loaded || lastOnProgress[id].total !== total) { + self._onProgress(id, name, loaded, total); + self._options.callbacks.onProgress(id, name, loaded, total); + } + } else { + self._onProgress(id, name, loaded, total); + self._options.callbacks.onProgress(id, name, loaded, total); + } + lastOnProgress[id] = { + loaded: loaded, + total: total + }; + }, + onComplete: function(id, name, result, xhr) { + delete lastOnProgress[id]; + var status = self.getUploads({ + id: id + }).status, retVal; + if (status === qq.status.UPLOAD_SUCCESSFUL || status === qq.status.UPLOAD_FAILED) { + return; + } + retVal = self._onComplete(id, name, result, xhr); + if (retVal instanceof qq.Promise) { + retVal.done(function() { + self._options.callbacks.onComplete(id, name, result, xhr); + }); + } else { + self._options.callbacks.onComplete(id, name, result, xhr); + } + }, + onCancel: function(id, name, cancelFinalizationEffort) { + var promise = new qq.Promise(); + self._handleCheckedCallback({ + name: "onCancel", + callback: qq.bind(self._options.callbacks.onCancel, self, id, name), + onFailure: promise.failure, + onSuccess: function() { + cancelFinalizationEffort.then(function() { + self._onCancel(id, name); + }); + promise.success(); + }, + identifier: id + }); + return promise; + }, + onUploadPrep: qq.bind(this._onUploadPrep, this), + onUpload: function(id, name) { + self._onUpload(id, name); + var onUploadResult = self._options.callbacks.onUpload(id, name); + if (qq.isGenericPromise(onUploadResult)) { + self.log(qq.format("onUpload for {} returned a Promise - waiting for resolution.", id)); + return onUploadResult; + } + return new qq.Promise().success(); + }, + onUploadChunk: function(id, name, chunkData) { + self._onUploadChunk(id, chunkData); + var onUploadChunkResult = self._options.callbacks.onUploadChunk(id, name, chunkData); + if (qq.isGenericPromise(onUploadChunkResult)) { + self.log(qq.format("onUploadChunk for {}.{} returned a Promise - waiting for resolution.", id, chunkData.partIndex)); + return onUploadChunkResult; + } + return new qq.Promise().success(); + }, + onUploadChunkSuccess: function(id, chunkData, result, xhr) { + self._onUploadChunkSuccess(id, chunkData); + self._options.callbacks.onUploadChunkSuccess.apply(self, arguments); + }, + onResume: function(id, name, chunkData, customResumeData) { + return self._options.callbacks.onResume(id, name, chunkData, customResumeData); + }, + onAutoRetry: function(id, name, responseJSON, xhr) { + return self._onAutoRetry.apply(self, arguments); + }, + onUuidChanged: function(id, newUuid) { + self.log("Server requested UUID change from '" + self.getUuid(id) + "' to '" + newUuid + "'"); + self.setUuid(id, newUuid); + }, + getName: qq.bind(self.getName, self), + getUuid: qq.bind(self.getUuid, self), + getSize: qq.bind(self.getSize, self), + setSize: qq.bind(self._setSize, self), + getDataByUuid: function(uuid) { + return self.getUploads({ + uuid: uuid + }); + }, + isQueued: function(id) { + var status = self.getUploads({ + id: id + }).status; + return status === qq.status.QUEUED || status === qq.status.SUBMITTED || status === qq.status.UPLOAD_RETRYING || status === qq.status.PAUSED; + }, + getIdsInProxyGroup: self._uploadData.getIdsInProxyGroup, + getIdsInBatch: self._uploadData.getIdsInBatch, + isInProgress: function(id) { + return self.getUploads({ + id: id + }).status === qq.status.UPLOADING; + }, + getCustomResumeData: qq.bind(self._getCustomResumeData, self), + setStatus: function(id, status) { + self._uploadData.setStatus(id, status); + } + }; + qq.each(this._options.request, function(prop, val) { + options[prop] = val; + }); + options.customHeaders = this._customHeadersStore; + if (additionalOptions) { + qq.each(additionalOptions, function(key, val) { + options[key] = val; + }); + } + return new qq.UploadHandlerController(options, namespace); + }, + _fileOrBlobRejected: function(id) { + this._netUploadedOrQueued--; + this._uploadData.setStatus(id, qq.status.REJECTED); + }, + _formatSize: function(bytes) { + if (bytes === 0) { + return bytes + this._options.text.sizeSymbols[0]; + } + var i = -1; + do { + bytes = bytes / 1e3; + i++; + } while (bytes > 999); + return Math.max(bytes, .1).toFixed(1) + this._options.text.sizeSymbols[i]; + }, + _generateExtraButtonSpecs: function() { + var self = this; + this._extraButtonSpecs = {}; + qq.each(this._options.extraButtons, function(idx, extraButtonOptionEntry) { + var multiple = extraButtonOptionEntry.multiple, validation = qq.extend({}, self._options.validation, true), extraButtonSpec = qq.extend({}, extraButtonOptionEntry); + if (multiple === undefined) { + multiple = self._options.multiple; + } + if (extraButtonSpec.validation) { + qq.extend(validation, extraButtonOptionEntry.validation, true); + } + qq.extend(extraButtonSpec, { + multiple: multiple, + validation: validation + }, true); + self._initExtraButton(extraButtonSpec); + }); + }, + _getButton: function(buttonId) { + var extraButtonsSpec = this._extraButtonSpecs[buttonId]; + if (extraButtonsSpec) { + return extraButtonsSpec.element; + } else if (buttonId === this._defaultButtonId) { + return this._options.button; + } + }, + _getButtonId: function(buttonOrFileInputOrFile) { + var inputs, fileInput, fileBlobOrInput = buttonOrFileInputOrFile; + if (fileBlobOrInput instanceof qq.BlobProxy) { + fileBlobOrInput = fileBlobOrInput.referenceBlob; + } + if (fileBlobOrInput && !qq.isBlob(fileBlobOrInput)) { + if (qq.isFile(fileBlobOrInput)) { + return fileBlobOrInput.qqButtonId; + } else if (fileBlobOrInput.tagName.toLowerCase() === "input" && fileBlobOrInput.type.toLowerCase() === "file") { + return fileBlobOrInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME); + } + inputs = fileBlobOrInput.getElementsByTagName("input"); + qq.each(inputs, function(idx, input) { + if (input.getAttribute("type") === "file") { + fileInput = input; + return false; + } + }); + if (fileInput) { + return fileInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME); + } + } + }, + _getCustomResumeData: function(fileId) { + return this._customResumeDataStore.get(fileId); + }, + _getNotFinished: function() { + return this._uploadData.retrieve({ + status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED, qq.status.SUBMITTING, qq.status.SUBMITTED, qq.status.PAUSED ] + }).length; + }, + _getValidationBase: function(buttonId) { + var extraButtonSpec = this._extraButtonSpecs[buttonId]; + return extraButtonSpec ? extraButtonSpec.validation : this._options.validation; + }, + _getValidationDescriptor: function(fileWrapper) { + if (fileWrapper.file instanceof qq.BlobProxy) { + return { + name: qq.getFilename(fileWrapper.file.referenceBlob), + size: fileWrapper.file.referenceBlob.size + }; + } + return { + name: this.getUploads({ + id: fileWrapper.id + }).name, + size: this.getUploads({ + id: fileWrapper.id + }).size + }; + }, + _getValidationDescriptors: function(fileWrappers) { + var self = this, fileDescriptors = []; + qq.each(fileWrappers, function(idx, fileWrapper) { + fileDescriptors.push(self._getValidationDescriptor(fileWrapper)); + }); + return fileDescriptors; + }, + _handleCameraAccess: function() { + if (this._options.camera.ios && qq.ios()) { + var acceptIosCamera = "image/*;capture=camera", button = this._options.camera.button, buttonId = button ? this._getButtonId(button) : this._defaultButtonId, optionRoot = this._options; + if (buttonId && buttonId !== this._defaultButtonId) { + optionRoot = this._extraButtonSpecs[buttonId]; + } + optionRoot.multiple = false; + if (optionRoot.validation.acceptFiles === null) { + optionRoot.validation.acceptFiles = acceptIosCamera; + } else { + optionRoot.validation.acceptFiles += "," + acceptIosCamera; + } + qq.each(this._buttons, function(idx, button) { + if (button.getButtonId() === buttonId) { + button.setMultiple(optionRoot.multiple); + button.setAcceptFiles(optionRoot.acceptFiles); + return false; + } + }); + } + }, + _handleCheckedCallback: function(details) { + var self = this, callbackRetVal = details.callback(); + if (qq.isGenericPromise(callbackRetVal)) { + this.log(details.name + " - waiting for " + details.name + " promise to be fulfilled for " + details.identifier); + return callbackRetVal.then(function(successParam) { + self.log(details.name + " promise success for " + details.identifier); + details.onSuccess(successParam); + }, function() { + if (details.onFailure) { + self.log(details.name + " promise failure for " + details.identifier); + details.onFailure(); + } else { + self.log(details.name + " promise failure for " + details.identifier); + } + }); + } + if (callbackRetVal !== false) { + details.onSuccess(callbackRetVal); + } else { + if (details.onFailure) { + this.log(details.name + " - return value was 'false' for " + details.identifier + ". Invoking failure callback."); + details.onFailure(); + } else { + this.log(details.name + " - return value was 'false' for " + details.identifier + ". Will not proceed."); + } + } + return callbackRetVal; + }, + _handleNewFile: function(file, batchId, newFileWrapperList) { + var self = this, uuid = qq.getUniqueId(), size = -1, name = qq.getFilename(file), actualFile = file.blob || file, handler = this._customNewFileHandler ? this._customNewFileHandler : qq.bind(self._handleNewFileGeneric, self); + if (!qq.isInput(actualFile) && actualFile.size >= 0) { + size = actualFile.size; + } + handler(actualFile, name, uuid, size, newFileWrapperList, batchId, this._options.request.uuidName, { + uploadData: self._uploadData, + paramsStore: self._paramsStore, + addFileToHandler: function(id, file) { + self._handler.add(id, file); + self._netUploadedOrQueued++; + self._trackButton(id); + } + }); + }, + _handleNewFileGeneric: function(file, name, uuid, size, fileList, batchId) { + var id = this._uploadData.addFile({ + uuid: uuid, + name: name, + size: size, + batchId: batchId, + file: file + }); + this._handler.add(id, file); + this._trackButton(id); + this._netUploadedOrQueued++; + fileList.push({ + id: id, + file: file + }); + }, + _handlePasteSuccess: function(blob, extSuppliedName) { + var extension = blob.type.split("/")[1], name = extSuppliedName; + if (name == null) { + name = this._options.paste.defaultName; + } + name += "." + extension; + this.addFiles({ + name: name, + blob: blob + }); + }, + _handleDeleteSuccess: function(id) { + if (this.getUploads({ + id: id + }).status !== qq.status.DELETED) { + var name = this.getName(id); + this._netUploadedOrQueued--; + this._netUploaded--; + this._handler.expunge(id); + this._uploadData.setStatus(id, qq.status.DELETED); + this.log("Delete request for '" + name + "' has succeeded."); + } + }, + _handleDeleteFailed: function(id, xhrOrXdr) { + var name = this.getName(id); + this._uploadData.setStatus(id, qq.status.DELETE_FAILED); + this.log("Delete request for '" + name + "' has failed.", "error"); + if (!xhrOrXdr || xhrOrXdr.withCredentials === undefined) { + this._options.callbacks.onError(id, name, "Delete request failed", xhrOrXdr); + } else { + this._options.callbacks.onError(id, name, "Delete request failed with response code " + xhrOrXdr.status, xhrOrXdr); + } + }, + _initExtraButton: function(spec) { + var button = this._createUploadButton({ + accept: spec.validation.acceptFiles, + allowedExtensions: spec.validation.allowedExtensions, + element: spec.element, + folders: spec.folders, + multiple: spec.multiple, + title: spec.fileInputTitle + }); + this._extraButtonSpecs[button.getButtonId()] = spec; + }, + _initFormSupportAndParams: function() { + this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this)); + if (this._formSupport && this._formSupport.attachedToForm) { + this._paramsStore = this._createStore(this._options.request.params, this._formSupport.getFormInputsAsObject); + this._options.autoUpload = this._formSupport.newAutoUpload; + if (this._formSupport.newEndpoint) { + this._options.request.endpoint = this._formSupport.newEndpoint; + } + } else { + this._paramsStore = this._createStore(this._options.request.params); + } + }, + _isDeletePossible: function() { + if (!qq.DeleteFileAjaxRequester || !this._options.deleteFile.enabled) { + return false; + } + if (this._options.cors.expected) { + if (qq.supportedFeatures.deleteFileCorsXhr) { + return true; + } + if (qq.supportedFeatures.deleteFileCorsXdr && this._options.cors.allowXdr) { + return true; + } + return false; + } + return true; + }, + _isAllowedExtension: function(allowed, fileName) { + var valid = false; + if (!allowed.length) { + return true; + } + qq.each(allowed, function(idx, allowedExt) { + if (qq.isString(allowedExt)) { + var extRegex = new RegExp("\\." + allowedExt + "$", "i"); + if (fileName.match(extRegex) != null) { + valid = true; + return false; + } + } + }); + return valid; + }, + _itemError: function(code, maybeNameOrNames, item) { + var message = this._options.messages[code], allowedExtensions = [], names = [].concat(maybeNameOrNames), name = names[0], buttonId = this._getButtonId(item), validationBase = this._getValidationBase(buttonId), extensionsForMessage, placeholderMatch; + function r(name, replacement) { + message = message.replace(name, replacement); + } + qq.each(validationBase.allowedExtensions, function(idx, allowedExtension) { + if (qq.isString(allowedExtension)) { + allowedExtensions.push(allowedExtension); + } + }); + extensionsForMessage = allowedExtensions.join(", ").toLowerCase(); + r("{file}", this._options.formatFileName(name)); + r("{extensions}", extensionsForMessage); + r("{sizeLimit}", this._formatSize(validationBase.sizeLimit)); + r("{minSizeLimit}", this._formatSize(validationBase.minSizeLimit)); + placeholderMatch = message.match(/(\{\w+\})/g); + if (placeholderMatch !== null) { + qq.each(placeholderMatch, function(idx, placeholder) { + r(placeholder, names[idx]); + }); + } + this._options.callbacks.onError(null, name, message, undefined); + return message; + }, + _manualRetry: function(id, callback) { + if (this._onBeforeManualRetry(id)) { + this._netUploadedOrQueued++; + this._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING); + if (callback) { + callback(id); + } else { + this._handler.retry(id); + } + return true; + } + }, + _maybeAllComplete: function(id, status) { + var self = this, notFinished = this._getNotFinished(); + if (status === qq.status.UPLOAD_SUCCESSFUL) { + this._succeededSinceLastAllComplete.push(id); + } else if (status === qq.status.UPLOAD_FAILED) { + this._failedSinceLastAllComplete.push(id); + } + if (notFinished === 0 && (this._succeededSinceLastAllComplete.length || this._failedSinceLastAllComplete.length)) { + setTimeout(function() { + self._onAllComplete(self._succeededSinceLastAllComplete, self._failedSinceLastAllComplete); + }, 0); + } + }, + _maybeHandleIos8SafariWorkaround: function() { + var self = this; + if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) { + setTimeout(function() { + window.alert(self._options.messages.unsupportedBrowserIos8Safari); + }, 0); + throw new qq.Error(this._options.messages.unsupportedBrowserIos8Safari); + } + }, + _maybeParseAndSendUploadError: function(id, name, response, xhr) { + if (!response.success) { + if (xhr && xhr.status !== 200 && !response.error) { + this._options.callbacks.onError(id, name, "XHR returned response code " + xhr.status, xhr); + } else { + var errorReason = response.error ? response.error : this._options.text.defaultResponseError; + this._options.callbacks.onError(id, name, errorReason, xhr); + } + } + }, + _maybeProcessNextItemAfterOnValidateCallback: function(validItem, items, index, params, endpoint) { + var self = this; + if (items.length > index) { + if (validItem || !this._options.validation.stopOnFirstInvalidFile) { + setTimeout(function() { + var validationDescriptor = self._getValidationDescriptor(items[index]), buttonId = self._getButtonId(items[index].file), button = self._getButton(buttonId); + self._handleCheckedCallback({ + name: "onValidate", + callback: qq.bind(self._options.callbacks.onValidate, self, validationDescriptor, button), + onSuccess: qq.bind(self._onValidateCallbackSuccess, self, items, index, params, endpoint), + onFailure: qq.bind(self._onValidateCallbackFailure, self, items, index, params, endpoint), + identifier: "Item '" + validationDescriptor.name + "', size: " + validationDescriptor.size + }); + }, 0); + } else if (!validItem) { + for (;index < items.length; index++) { + self._fileOrBlobRejected(items[index].id); + } + } + } + }, + _onAllComplete: function(successful, failed) { + this._totalProgress && this._totalProgress.onAllComplete(successful, failed, this._preventRetries); + this._options.callbacks.onAllComplete(qq.extend([], successful), qq.extend([], failed)); + this._succeededSinceLastAllComplete = []; + this._failedSinceLastAllComplete = []; + }, + _onAutoRetry: function(id, name, responseJSON, xhr, callback) { + var self = this; + self._preventRetries[id] = responseJSON[self._options.retry.preventRetryResponseProperty]; + if (self._shouldAutoRetry(id)) { + var retryWaitPeriod = self._options.retry.autoAttemptDelay * 1e3; + self._maybeParseAndSendUploadError.apply(self, arguments); + self._options.callbacks.onAutoRetry(id, name, self._autoRetries[id]); + self._onBeforeAutoRetry(id, name); + self._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING); + self._retryTimeouts[id] = setTimeout(function() { + self.log("Starting retry for " + name + "..."); + if (callback) { + callback(id); + } else { + self._handler.retry(id); + } + }, retryWaitPeriod); + return true; + } + }, + _onBeforeAutoRetry: function(id, name) { + this.log("Waiting " + this._options.retry.autoAttemptDelay + " seconds before retrying " + name + "..."); + }, + _onBeforeManualRetry: function(id) { + var itemLimit = this._currentItemLimit, fileName; + if (this._preventRetries[id]) { + this.log("Retries are forbidden for id " + id, "warn"); + return false; + } else if (this._handler.isValid(id)) { + fileName = this.getName(id); + if (this._options.callbacks.onManualRetry(id, fileName) === false) { + return false; + } + if (itemLimit > 0 && this._netUploadedOrQueued + 1 > itemLimit) { + this._itemError("retryFailTooManyItems"); + return false; + } + this.log("Retrying upload for '" + fileName + "' (id: " + id + ")..."); + return true; + } else { + this.log("'" + id + "' is not a valid file ID", "error"); + return false; + } + }, + _onCancel: function(id, name) { + this._netUploadedOrQueued--; + clearTimeout(this._retryTimeouts[id]); + var storedItemIndex = qq.indexOf(this._storedIds, id); + if (!this._options.autoUpload && storedItemIndex >= 0) { + this._storedIds.splice(storedItemIndex, 1); + } + this._uploadData.setStatus(id, qq.status.CANCELED); + }, + _onComplete: function(id, name, result, xhr) { + if (!result.success) { + this._netUploadedOrQueued--; + this._uploadData.setStatus(id, qq.status.UPLOAD_FAILED); + if (result[this._options.retry.preventRetryResponseProperty] === true) { + this._preventRetries[id] = true; + } + } else { + if (result.thumbnailUrl) { + this._thumbnailUrls[id] = result.thumbnailUrl; + } + this._netUploaded++; + this._uploadData.setStatus(id, qq.status.UPLOAD_SUCCESSFUL); + } + this._maybeParseAndSendUploadError(id, name, result, xhr); + return result.success ? true : false; + }, + _onDelete: function(id) { + this._uploadData.setStatus(id, qq.status.DELETING); + }, + _onDeleteComplete: function(id, xhrOrXdr, isError) { + var name = this.getName(id); + if (isError) { + this._handleDeleteFailed(id, xhrOrXdr); + } else { + this._handleDeleteSuccess(id); + } + }, + _onInputChange: function(input) { + var fileIndex; + if (qq.supportedFeatures.ajaxUploading) { + for (fileIndex = 0; fileIndex < input.files.length; fileIndex++) { + this._annotateWithButtonId(input.files[fileIndex], input); + } + this.addFiles(input.files); + } else if (input.value.length > 0) { + this.addFiles(input); + } + qq.each(this._buttons, function(idx, button) { + button.reset(); + }); + }, + _onProgress: function(id, name, loaded, total) { + this._totalProgress && this._totalProgress.onIndividualProgress(id, loaded, total); + }, + _onSubmit: function(id, name) {}, + _onSubmitCallbackSuccess: function(id, name) { + this._onSubmit.apply(this, arguments); + this._uploadData.setStatus(id, qq.status.SUBMITTED); + this._onSubmitted.apply(this, arguments); + if (this._options.autoUpload) { + this._options.callbacks.onSubmitted.apply(this, arguments); + this._uploadFile(id); + } else { + this._storeForLater(id); + this._options.callbacks.onSubmitted.apply(this, arguments); + } + }, + _onSubmitDelete: function(id, onSuccessCallback, additionalMandatedParams) { + var uuid = this.getUuid(id), adjustedOnSuccessCallback; + if (onSuccessCallback) { + adjustedOnSuccessCallback = qq.bind(onSuccessCallback, this, id, uuid, additionalMandatedParams); + } + if (this._isDeletePossible()) { + this._handleCheckedCallback({ + name: "onSubmitDelete", + callback: qq.bind(this._options.callbacks.onSubmitDelete, this, id), + onSuccess: adjustedOnSuccessCallback || qq.bind(this._deleteHandler.sendDelete, this, id, uuid, additionalMandatedParams), + identifier: id + }); + return true; + } else { + this.log("Delete request ignored for ID " + id + ", delete feature is disabled or request not possible " + "due to CORS on a user agent that does not support pre-flighting.", "warn"); + return false; + } + }, + _onSubmitted: function(id) {}, + _onTotalProgress: function(loaded, total) { + this._options.callbacks.onTotalProgress(loaded, total); + }, + _onUploadPrep: function(id) {}, + _onUpload: function(id, name) { + this._uploadData.setStatus(id, qq.status.UPLOADING); + }, + _onUploadChunk: function(id, chunkData) {}, + _onUploadChunkSuccess: function(id, chunkData) { + if (!this._preventRetries[id] && this._options.retry.enableAuto) { + this._autoRetries[id] = 0; + } + }, + _onUploadStatusChange: function(id, oldStatus, newStatus) { + if (newStatus === qq.status.PAUSED) { + clearTimeout(this._retryTimeouts[id]); + } + }, + _onValidateBatchCallbackFailure: function(fileWrappers) { + var self = this; + qq.each(fileWrappers, function(idx, fileWrapper) { + self._fileOrBlobRejected(fileWrapper.id); + }); + }, + _onValidateBatchCallbackSuccess: function(validationDescriptors, items, params, endpoint, button) { + var errorMessage, itemLimit = this._currentItemLimit, proposedNetFilesUploadedOrQueued = this._netUploadedOrQueued; + if (itemLimit === 0 || proposedNetFilesUploadedOrQueued <= itemLimit) { + if (items.length > 0) { + this._handleCheckedCallback({ + name: "onValidate", + callback: qq.bind(this._options.callbacks.onValidate, this, validationDescriptors[0], button), + onSuccess: qq.bind(this._onValidateCallbackSuccess, this, items, 0, params, endpoint), + onFailure: qq.bind(this._onValidateCallbackFailure, this, items, 0, params, endpoint), + identifier: "Item '" + items[0].file.name + "', size: " + items[0].file.size + }); + } else { + this._itemError("noFilesError"); + } + } else { + this._onValidateBatchCallbackFailure(items); + errorMessage = this._options.messages.tooManyItemsError.replace(/\{netItems\}/g, proposedNetFilesUploadedOrQueued).replace(/\{itemLimit\}/g, itemLimit); + this._batchError(errorMessage); + } + }, + _onValidateCallbackFailure: function(items, index, params, endpoint) { + var nextIndex = index + 1; + this._fileOrBlobRejected(items[index].id, items[index].file.name); + this._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint); + }, + _onValidateCallbackSuccess: function(items, index, params, endpoint) { + var self = this, nextIndex = index + 1, validationDescriptor = this._getValidationDescriptor(items[index]); + this._validateFileOrBlobData(items[index], validationDescriptor).then(function() { + self._upload(items[index].id, params, endpoint); + self._maybeProcessNextItemAfterOnValidateCallback(true, items, nextIndex, params, endpoint); + }, function() { + self._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint); + }); + }, + _prepareItemsForUpload: function(items, params, endpoint) { + if (items.length === 0) { + this._itemError("noFilesError"); + return; + } + var validationDescriptors = this._getValidationDescriptors(items), buttonId = this._getButtonId(items[0].file), button = this._getButton(buttonId); + this._handleCheckedCallback({ + name: "onValidateBatch", + callback: qq.bind(this._options.callbacks.onValidateBatch, this, validationDescriptors, button), + onSuccess: qq.bind(this._onValidateBatchCallbackSuccess, this, validationDescriptors, items, params, endpoint, button), + onFailure: qq.bind(this._onValidateBatchCallbackFailure, this, items), + identifier: "batch validation" + }); + }, + _preventLeaveInProgress: function() { + var self = this; + this._disposeSupport.attach(window, "beforeunload", function(e) { + if (self.getInProgress()) { + e = e || window.event; + e.returnValue = self._options.messages.onLeave; + return self._options.messages.onLeave; + } + }); + }, + _refreshSessionData: function() { + var self = this, options = this._options.session; + if (qq.Session && this._options.session.endpoint != null) { + if (!this._session) { + qq.extend(options, { + cors: this._options.cors + }); + options.log = qq.bind(this.log, this); + options.addFileRecord = qq.bind(this._addCannedFile, this); + this._session = new qq.Session(options); + } + setTimeout(function() { + self._session.refresh().then(function(response, xhrOrXdr) { + self._sessionRequestComplete(); + self._options.callbacks.onSessionRequestComplete(response, true, xhrOrXdr); + }, function(response, xhrOrXdr) { + self._options.callbacks.onSessionRequestComplete(response, false, xhrOrXdr); + }); + }, 0); + } + }, + _sessionRequestComplete: function() {}, + _setSize: function(id, newSize) { + this._uploadData.updateSize(id, newSize); + this._totalProgress && this._totalProgress.onNewSize(id); + }, + _shouldAutoRetry: function(id) { + var uploadData = this._uploadData.retrieve({ + id: id + }); + if (!this._preventRetries[id] && this._options.retry.enableAuto && uploadData.status !== qq.status.PAUSED) { + if (this._autoRetries[id] === undefined) { + this._autoRetries[id] = 0; + } + if (this._autoRetries[id] < this._options.retry.maxAutoAttempts) { + this._autoRetries[id] += 1; + return true; + } + } + return false; + }, + _storeForLater: function(id) { + this._storedIds.push(id); + }, + _trackButton: function(id) { + var buttonId; + if (qq.supportedFeatures.ajaxUploading) { + buttonId = this._handler.getFile(id).qqButtonId; + } else { + buttonId = this._getButtonId(this._handler.getInput(id)); + } + if (buttonId) { + this._buttonIdsForFileIds[id] = buttonId; + } + }, + _updateFormSupportAndParams: function(formElementOrId) { + this._options.form.element = formElementOrId; + this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this)); + if (this._formSupport && this._formSupport.attachedToForm) { + this._paramsStore.addReadOnly(null, this._formSupport.getFormInputsAsObject); + this._options.autoUpload = this._formSupport.newAutoUpload; + if (this._formSupport.newEndpoint) { + this.setEndpoint(this._formSupport.newEndpoint); + } + } + }, + _upload: function(id, params, endpoint) { + var name = this.getName(id); + if (params) { + this.setParams(params, id); + } + if (endpoint) { + this.setEndpoint(endpoint, id); + } + this._handleCheckedCallback({ + name: "onSubmit", + callback: qq.bind(this._options.callbacks.onSubmit, this, id, name), + onSuccess: qq.bind(this._onSubmitCallbackSuccess, this, id, name), + onFailure: qq.bind(this._fileOrBlobRejected, this, id, name), + identifier: id + }); + }, + _uploadFile: function(id) { + if (!this._handler.upload(id)) { + this._uploadData.setStatus(id, qq.status.QUEUED); + } + }, + _uploadStoredFiles: function() { + var idToUpload, stillSubmitting, self = this; + while (this._storedIds.length) { + idToUpload = this._storedIds.shift(); + this._uploadFile(idToUpload); + } + stillSubmitting = this.getUploads({ + status: qq.status.SUBMITTING + }).length; + if (stillSubmitting) { + qq.log("Still waiting for " + stillSubmitting + " files to clear submit queue. Will re-parse stored IDs array shortly."); + setTimeout(function() { + self._uploadStoredFiles(); + }, 1e3); + } + }, + _validateFileOrBlobData: function(fileWrapper, validationDescriptor) { + var self = this, file = function() { + if (fileWrapper.file instanceof qq.BlobProxy) { + return fileWrapper.file.referenceBlob; + } + return fileWrapper.file; + }(), name = validationDescriptor.name, size = validationDescriptor.size, buttonId = this._getButtonId(fileWrapper.file), validationBase = this._getValidationBase(buttonId), validityChecker = new qq.Promise(); + validityChecker.then(function() {}, function() { + self._fileOrBlobRejected(fileWrapper.id, name); + }); + if (qq.isFileOrInput(file) && !this._isAllowedExtension(validationBase.allowedExtensions, name)) { + this._itemError("typeError", name, file); + return validityChecker.failure(); + } + if (!this._options.validation.allowEmpty && size === 0) { + this._itemError("emptyError", name, file); + return validityChecker.failure(); + } + if (size > 0 && validationBase.sizeLimit && size > validationBase.sizeLimit) { + this._itemError("sizeError", name, file); + return validityChecker.failure(); + } + if (size > 0 && size < validationBase.minSizeLimit) { + this._itemError("minSizeError", name, file); + return validityChecker.failure(); + } + if (qq.ImageValidation && qq.supportedFeatures.imagePreviews && qq.isFile(file)) { + new qq.ImageValidation(file, qq.bind(self.log, self)).validate(validationBase.image).then(validityChecker.success, function(errorCode) { + self._itemError(errorCode + "ImageError", name, file); + validityChecker.failure(); + }); + } else { + validityChecker.success(); + } + return validityChecker; + }, + _wrapCallbacks: function() { + var self, safeCallback, prop; + self = this; + safeCallback = function(name, callback, args) { + var errorMsg; + try { + return callback.apply(self, args); + } catch (exception) { + errorMsg = exception.message || exception.toString(); + self.log("Caught exception in '" + name + "' callback - " + errorMsg, "error"); + } + }; + for (prop in this._options.callbacks) { + (function() { + var callbackName, callbackFunc; + callbackName = prop; + callbackFunc = self._options.callbacks[callbackName]; + self._options.callbacks[callbackName] = function() { + return safeCallback(callbackName, callbackFunc, arguments); + }; + })(); + } + } + }; + })(); + (function() { + "use strict"; + qq.FineUploaderBasic = function(o) { + var self = this; + this._options = { + debug: false, + button: null, + multiple: true, + maxConnections: 3, + disableCancelForFormUploads: false, + autoUpload: true, + warnBeforeUnload: true, + request: { + customHeaders: {}, + endpoint: "/server/upload", + filenameParam: "qqfilename", + forceMultipart: true, + inputName: "qqfile", + method: "POST", + omitDefaultParams: false, + params: {}, + paramsInBody: true, + requireSuccessJson: true, + totalFileSizeName: "qqtotalfilesize", + uuidName: "qquuid" + }, + validation: { + allowedExtensions: [], + sizeLimit: 0, + minSizeLimit: 0, + itemLimit: 0, + stopOnFirstInvalidFile: true, + acceptFiles: null, + image: { + maxHeight: 0, + maxWidth: 0, + minHeight: 0, + minWidth: 0 + }, + allowEmpty: false + }, + callbacks: { + onSubmit: function(id, name) {}, + onSubmitted: function(id, name) {}, + onComplete: function(id, name, responseJSON, maybeXhr) {}, + onAllComplete: function(successful, failed) {}, + onCancel: function(id, name) {}, + onUpload: function(id, name) {}, + onUploadChunk: function(id, name, chunkData) {}, + onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr) {}, + onResume: function(id, fileName, chunkData, customResumeData) {}, + onProgress: function(id, name, loaded, total) {}, + onTotalProgress: function(loaded, total) {}, + onError: function(id, name, reason, maybeXhrOrXdr) {}, + onAutoRetry: function(id, name, attemptNumber) {}, + onManualRetry: function(id, name) {}, + onValidateBatch: function(fileOrBlobData) {}, + onValidate: function(fileOrBlobData) {}, + onSubmitDelete: function(id) {}, + onDelete: function(id) {}, + onDeleteComplete: function(id, xhrOrXdr, isError) {}, + onPasteReceived: function(blob) {}, + onStatusChange: function(id, oldStatus, newStatus) {}, + onSessionRequestComplete: function(response, success, xhrOrXdr) {} + }, + messages: { + typeError: "{file} has an invalid extension. Valid extension(s): {extensions}.", + sizeError: "{file} is too large, maximum file size is {sizeLimit}.", + minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.", + emptyError: "{file} is empty, please select files again without it.", + noFilesError: "No files to upload.", + tooManyItemsError: "Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.", + maxHeightImageError: "Image is too tall.", + maxWidthImageError: "Image is too wide.", + minHeightImageError: "Image is not tall enough.", + minWidthImageError: "Image is not wide enough.", + retryFailTooManyItems: "Retry failed - you have reached your file limit.", + onLeave: "The files are being uploaded, if you leave now the upload will be canceled.", + unsupportedBrowserIos8Safari: "Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues." + }, + retry: { + enableAuto: false, + maxAutoAttempts: 3, + autoAttemptDelay: 5, + preventRetryResponseProperty: "preventRetry" + }, + classes: { + buttonHover: "qq-upload-button-hover", + buttonFocus: "qq-upload-button-focus" + }, + chunking: { + enabled: false, + concurrent: { + enabled: false + }, + mandatory: false, + paramNames: { + partIndex: "qqpartindex", + partByteOffset: "qqpartbyteoffset", + chunkSize: "qqchunksize", + totalFileSize: "qqtotalfilesize", + totalParts: "qqtotalparts" + }, + partSize: function(id) { + return 2e6; + }, + success: { + endpoint: null, + headers: function(id) { + return null; + }, + jsonPayload: false, + method: "POST", + params: function(id) { + return null; + }, + resetOnStatus: [] + } + }, + resume: { + enabled: false, + recordsExpireIn: 7, + paramNames: { + resuming: "qqresume" + }, + customKeys: function(fileId) { + return []; + } + }, + formatFileName: function(fileOrBlobName) { + return fileOrBlobName; + }, + text: { + defaultResponseError: "Upload failure reason unknown", + fileInputTitle: "file input", + sizeSymbols: [ "kB", "MB", "GB", "TB", "PB", "EB" ] + }, + deleteFile: { + enabled: false, + method: "DELETE", + endpoint: "/server/upload", + customHeaders: {}, + params: {} + }, + cors: { + expected: false, + sendCredentials: false, + allowXdr: false + }, + blobs: { + defaultName: "misc_data" + }, + paste: { + targetElement: null, + defaultName: "pasted_image" + }, + camera: { + ios: false, + button: null + }, + extraButtons: [], + session: { + endpoint: null, + params: {}, + customHeaders: {}, + refreshOnReset: true + }, + form: { + element: "qq-form", + autoUpload: false, + interceptSubmit: true + }, + scaling: { + customResizer: null, + sendOriginal: true, + orient: true, + defaultType: null, + defaultQuality: 80, + failureText: "Failed to scale", + includeExif: false, + sizes: [] + }, + workarounds: { + iosEmptyVideos: true, + ios8SafariUploads: true, + ios8BrowserCrash: false + } + }; + qq.extend(this._options, o, true); + this._buttons = []; + this._extraButtonSpecs = {}; + this._buttonIdsForFileIds = []; + this._wrapCallbacks(); + this._disposeSupport = new qq.DisposeSupport(); + this._storedIds = []; + this._autoRetries = []; + this._retryTimeouts = []; + this._preventRetries = []; + this._thumbnailUrls = []; + this._netUploadedOrQueued = 0; + this._netUploaded = 0; + this._uploadData = this._createUploadDataTracker(); + this._initFormSupportAndParams(); + this._customHeadersStore = this._createStore(this._options.request.customHeaders); + this._deleteFileCustomHeadersStore = this._createStore(this._options.deleteFile.customHeaders); + this._deleteFileParamsStore = this._createStore(this._options.deleteFile.params); + this._endpointStore = this._createStore(this._options.request.endpoint); + this._deleteFileEndpointStore = this._createStore(this._options.deleteFile.endpoint); + this._handler = this._createUploadHandler(); + this._deleteHandler = qq.DeleteFileAjaxRequester && this._createDeleteHandler(); + if (this._options.button) { + this._defaultButtonId = this._createUploadButton({ + element: this._options.button, + title: this._options.text.fileInputTitle + }).getButtonId(); + } + this._generateExtraButtonSpecs(); + this._handleCameraAccess(); + if (this._options.paste.targetElement) { + if (qq.PasteSupport) { + this._pasteHandler = this._createPasteHandler(); + } else { + this.log("Paste support module not found", "error"); + } + } + this._options.warnBeforeUnload && this._preventLeaveInProgress(); + this._imageGenerator = qq.ImageGenerator && new qq.ImageGenerator(qq.bind(this.log, this)); + this._refreshSessionData(); + this._succeededSinceLastAllComplete = []; + this._failedSinceLastAllComplete = []; + this._scaler = qq.Scaler && new qq.Scaler(this._options.scaling, qq.bind(this.log, this)) || {}; + if (this._scaler.enabled) { + this._customNewFileHandler = qq.bind(this._scaler.handleNewFile, this._scaler); + } + if (qq.TotalProgress && qq.supportedFeatures.progressBar) { + this._totalProgress = new qq.TotalProgress(qq.bind(this._onTotalProgress, this), function(id) { + var entry = self._uploadData.retrieve({ + id: id + }); + return entry && entry.size || 0; + }); + } + this._currentItemLimit = this._options.validation.itemLimit; + this._customResumeDataStore = this._createStore(); + }; + qq.FineUploaderBasic.prototype = qq.basePublicApi; + qq.extend(qq.FineUploaderBasic.prototype, qq.basePrivateApi); + })(); + qq.AjaxRequester = function(o) { + "use strict"; + var log, shouldParamsBeInQueryString, queue = [], requestData = {}, options = { + acceptHeader: null, + validMethods: [ "PATCH", "POST", "PUT" ], + method: "POST", + contentType: "application/x-www-form-urlencoded", + maxConnections: 3, + customHeaders: {}, + endpointStore: {}, + paramsStore: {}, + mandatedParams: {}, + allowXRequestedWithAndCacheControl: true, + successfulResponseCodes: { + DELETE: [ 200, 202, 204 ], + PATCH: [ 200, 201, 202, 203, 204 ], + POST: [ 200, 201, 202, 203, 204 ], + PUT: [ 200, 201, 202, 203, 204 ], + GET: [ 200 ] + }, + cors: { + expected: false, + sendCredentials: false + }, + log: function(str, level) {}, + onSend: function(id) {}, + onComplete: function(id, xhrOrXdr, isError) {}, + onProgress: null + }; + qq.extend(options, o); + log = options.log; + if (qq.indexOf(options.validMethods, options.method) < 0) { + throw new Error("'" + options.method + "' is not a supported method for this type of request!"); + } + function isSimpleMethod() { + return qq.indexOf([ "GET", "POST", "HEAD" ], options.method) >= 0; + } + function containsNonSimpleHeaders(headers) { + var containsNonSimple = false; + qq.each(containsNonSimple, function(idx, header) { + if (qq.indexOf([ "Accept", "Accept-Language", "Content-Language", "Content-Type" ], header) < 0) { + containsNonSimple = true; + return false; + } + }); + return containsNonSimple; + } + function isXdr(xhr) { + return options.cors.expected && xhr.withCredentials === undefined; + } + function getCorsAjaxTransport() { + var xhrOrXdr; + if (window.XMLHttpRequest || window.ActiveXObject) { + xhrOrXdr = qq.createXhrInstance(); + if (xhrOrXdr.withCredentials === undefined) { + xhrOrXdr = new XDomainRequest(); + xhrOrXdr.onload = function() {}; + xhrOrXdr.onerror = function() {}; + xhrOrXdr.ontimeout = function() {}; + xhrOrXdr.onprogress = function() {}; + } + } + return xhrOrXdr; + } + function getXhrOrXdr(id, suppliedXhr) { + var xhrOrXdr = requestData[id] && requestData[id].xhr; + if (!xhrOrXdr) { + if (suppliedXhr) { + xhrOrXdr = suppliedXhr; + } else { + if (options.cors.expected) { + xhrOrXdr = getCorsAjaxTransport(); + } else { + xhrOrXdr = qq.createXhrInstance(); + } + } + requestData[id].xhr = xhrOrXdr; + } + return xhrOrXdr; + } + function dequeue(id) { + var i = qq.indexOf(queue, id), max = options.maxConnections, nextId; + delete requestData[id]; + queue.splice(i, 1); + if (queue.length >= max && i < max) { + nextId = queue[max - 1]; + sendRequest(nextId); + } + } + function onComplete(id, xdrError) { + var xhr = getXhrOrXdr(id), method = options.method, isError = xdrError === true; + dequeue(id); + if (isError) { + log(method + " request for " + id + " has failed", "error"); + } else if (!isXdr(xhr) && !isResponseSuccessful(xhr.status)) { + isError = true; + log(method + " request for " + id + " has failed - response code " + xhr.status, "error"); + } + options.onComplete(id, xhr, isError); + } + function getParams(id) { + var onDemandParams = requestData[id].additionalParams, mandatedParams = options.mandatedParams, params; + if (options.paramsStore.get) { + params = options.paramsStore.get(id); + } + if (onDemandParams) { + qq.each(onDemandParams, function(name, val) { + params = params || {}; + params[name] = val; + }); + } + if (mandatedParams) { + qq.each(mandatedParams, function(name, val) { + params = params || {}; + params[name] = val; + }); + } + return params; + } + function sendRequest(id, optXhr) { + var xhr = getXhrOrXdr(id, optXhr), method = options.method, params = getParams(id), payload = requestData[id].payload, url; + options.onSend(id); + url = createUrl(id, params, requestData[id].additionalQueryParams); + if (isXdr(xhr)) { + xhr.onload = getXdrLoadHandler(id); + xhr.onerror = getXdrErrorHandler(id); + } else { + xhr.onreadystatechange = getXhrReadyStateChangeHandler(id); + } + registerForUploadProgress(id); + xhr.open(method, url, true); + if (options.cors.expected && options.cors.sendCredentials && !isXdr(xhr)) { + xhr.withCredentials = true; + } + setHeaders(id); + log("Sending " + method + " request for " + id); + if (payload) { + xhr.send(payload); + } else if (shouldParamsBeInQueryString || !params) { + xhr.send(); + } else if (params && options.contentType && options.contentType.toLowerCase().indexOf("application/x-www-form-urlencoded") >= 0) { + xhr.send(qq.obj2url(params, "")); + } else if (params && options.contentType && options.contentType.toLowerCase().indexOf("application/json") >= 0) { + xhr.send(JSON.stringify(params)); + } else { + xhr.send(params); + } + return xhr; + } + function createUrl(id, params, additionalQueryParams) { + var endpoint = options.endpointStore.get(id), addToPath = requestData[id].addToPath; + if (addToPath != undefined) { + endpoint += "/" + addToPath; + } + if (shouldParamsBeInQueryString && params) { + endpoint = qq.obj2url(params, endpoint); + } + if (additionalQueryParams) { + endpoint = qq.obj2url(additionalQueryParams, endpoint); + } + return endpoint; + } + function getXhrReadyStateChangeHandler(id) { + return function() { + if (getXhrOrXdr(id).readyState === 4) { + onComplete(id); + } + }; + } + function registerForUploadProgress(id) { + var onProgress = options.onProgress; + if (onProgress) { + getXhrOrXdr(id).upload.onprogress = function(e) { + if (e.lengthComputable) { + onProgress(id, e.loaded, e.total); + } + }; + } + } + function getXdrLoadHandler(id) { + return function() { + onComplete(id); + }; + } + function getXdrErrorHandler(id) { + return function() { + onComplete(id, true); + }; + } + function setHeaders(id) { + var xhr = getXhrOrXdr(id), customHeaders = options.customHeaders, onDemandHeaders = requestData[id].additionalHeaders || {}, method = options.method, allHeaders = {}; + if (!isXdr(xhr)) { + options.acceptHeader && xhr.setRequestHeader("Accept", options.acceptHeader); + if (options.allowXRequestedWithAndCacheControl) { + if (!options.cors.expected || (!isSimpleMethod() || containsNonSimpleHeaders(customHeaders))) { + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.setRequestHeader("Cache-Control", "no-cache"); + } + } + if (options.contentType && (method === "POST" || method === "PUT")) { + xhr.setRequestHeader("Content-Type", options.contentType); + } + qq.extend(allHeaders, qq.isFunction(customHeaders) ? customHeaders(id) : customHeaders); + qq.extend(allHeaders, onDemandHeaders); + qq.each(allHeaders, function(name, val) { + xhr.setRequestHeader(name, val); + }); + } + } + function isResponseSuccessful(responseCode) { + return qq.indexOf(options.successfulResponseCodes[options.method], responseCode) >= 0; + } + function prepareToSend(id, optXhr, addToPath, additionalParams, additionalQueryParams, additionalHeaders, payload) { + requestData[id] = { + addToPath: addToPath, + additionalParams: additionalParams, + additionalQueryParams: additionalQueryParams, + additionalHeaders: additionalHeaders, + payload: payload + }; + var len = queue.push(id); + if (len <= options.maxConnections) { + return sendRequest(id, optXhr); + } + } + shouldParamsBeInQueryString = options.method === "GET" || options.method === "DELETE"; + qq.extend(this, { + initTransport: function(id) { + var path, params, headers, payload, cacheBuster, additionalQueryParams; + return { + withPath: function(appendToPath) { + path = appendToPath; + return this; + }, + withParams: function(additionalParams) { + params = additionalParams; + return this; + }, + withQueryParams: function(_additionalQueryParams_) { + additionalQueryParams = _additionalQueryParams_; + return this; + }, + withHeaders: function(additionalHeaders) { + headers = additionalHeaders; + return this; + }, + withPayload: function(thePayload) { + payload = thePayload; + return this; + }, + withCacheBuster: function() { + cacheBuster = true; + return this; + }, + send: function(optXhr) { + if (cacheBuster && qq.indexOf([ "GET", "DELETE" ], options.method) >= 0) { + params.qqtimestamp = new Date().getTime(); + } + return prepareToSend(id, optXhr, path, params, additionalQueryParams, headers, payload); + } + }; + }, + canceled: function(id) { + dequeue(id); + } + }); + }; + qq.UploadHandler = function(spec) { + "use strict"; + var proxy = spec.proxy, fileState = {}, onCancel = proxy.onCancel, getName = proxy.getName; + qq.extend(this, { + add: function(id, fileItem) { + fileState[id] = fileItem; + fileState[id].temp = {}; + }, + cancel: function(id) { + var self = this, cancelFinalizationEffort = new qq.Promise(), onCancelRetVal = onCancel(id, getName(id), cancelFinalizationEffort); + onCancelRetVal.then(function() { + if (self.isValid(id)) { + fileState[id].canceled = true; + self.expunge(id); + } + cancelFinalizationEffort.success(); + }); + }, + expunge: function(id) { + delete fileState[id]; + }, + getThirdPartyFileId: function(id) { + return fileState[id].key; + }, + isValid: function(id) { + return fileState[id] !== undefined; + }, + reset: function() { + fileState = {}; + }, + _getFileState: function(id) { + return fileState[id]; + }, + _setThirdPartyFileId: function(id, thirdPartyFileId) { + fileState[id].key = thirdPartyFileId; + }, + _wasCanceled: function(id) { + return !!fileState[id].canceled; + } + }); + }; + qq.UploadHandlerController = function(o, namespace) { + "use strict"; + var controller = this, chunkingPossible = false, concurrentChunkingPossible = false, chunking, preventRetryResponse, log, handler, options = { + paramsStore: {}, + maxConnections: 3, + chunking: { + enabled: false, + multiple: { + enabled: false + } + }, + log: function(str, level) {}, + onProgress: function(id, fileName, loaded, total) {}, + onComplete: function(id, fileName, response, xhr) {}, + onCancel: function(id, fileName) {}, + onUploadPrep: function(id) {}, + onUpload: function(id, fileName) {}, + onUploadChunk: function(id, fileName, chunkData) {}, + onUploadChunkSuccess: function(id, chunkData, response, xhr) {}, + onAutoRetry: function(id, fileName, response, xhr) {}, + onResume: function(id, fileName, chunkData, customResumeData) {}, + onUuidChanged: function(id, newUuid) {}, + getName: function(id) {}, + setSize: function(id, newSize) {}, + isQueued: function(id) {}, + getIdsInProxyGroup: function(id) {}, + getIdsInBatch: function(id) {}, + isInProgress: function(id) {} + }, chunked = { + done: function(id, chunkIdx, response, xhr) { + var chunkData = handler._getChunkData(id, chunkIdx); + handler._getFileState(id).attemptingResume = false; + delete handler._getFileState(id).temp.chunkProgress[chunkIdx]; + handler._getFileState(id).loaded += chunkData.size; + options.onUploadChunkSuccess(id, handler._getChunkDataForCallback(chunkData), response, xhr); + }, + finalize: function(id) { + var size = options.getSize(id), name = options.getName(id); + log("All chunks have been uploaded for " + id + " - finalizing...."); + handler.finalizeChunks(id).then(function(response, xhr) { + log("Finalize successful for " + id); + var normaizedResponse = upload.normalizeResponse(response, true); + options.onProgress(id, name, size, size); + handler._maybeDeletePersistedChunkData(id); + upload.cleanup(id, normaizedResponse, xhr); + }, function(response, xhr) { + var normalizedResponse = upload.normalizeResponse(response, false); + log("Problem finalizing chunks for file ID " + id + " - " + normalizedResponse.error, "error"); + if (normalizedResponse.reset || xhr && options.chunking.success.resetOnStatus.indexOf(xhr.status) >= 0) { + chunked.reset(id); + } + if (!options.onAutoRetry(id, name, normalizedResponse, xhr)) { + upload.cleanup(id, normalizedResponse, xhr); + } + }); + }, + handleFailure: function(chunkIdx, id, response, xhr) { + var name = options.getName(id); + log("Chunked upload request failed for " + id + ", chunk " + chunkIdx); + handler.clearCachedChunk(id, chunkIdx); + var responseToReport = upload.normalizeResponse(response, false), inProgressIdx; + if (responseToReport.reset) { + chunked.reset(id); + } else { + var inProgressChunksArray = handler._getFileState(id).chunking.inProgress; + inProgressIdx = inProgressChunksArray ? qq.indexOf(inProgressChunksArray, chunkIdx) : -1; + if (inProgressIdx >= 0) { + handler._getFileState(id).chunking.inProgress.splice(inProgressIdx, 1); + handler._getFileState(id).chunking.remaining.unshift(chunkIdx); + } + } + if (!handler._getFileState(id).temp.ignoreFailure) { + if (concurrentChunkingPossible) { + handler._getFileState(id).temp.ignoreFailure = true; + log(qq.format("Going to attempt to abort these chunks: {}. These are currently in-progress: {}.", JSON.stringify(Object.keys(handler._getXhrs(id))), JSON.stringify(handler._getFileState(id).chunking.inProgress))); + qq.each(handler._getXhrs(id), function(ckid, ckXhr) { + log(qq.format("Attempting to abort file {}.{}. XHR readyState {}. ", id, ckid, ckXhr.readyState)); + ckXhr.abort(); + ckXhr._cancelled = true; + }); + handler.moveInProgressToRemaining(id); + connectionManager.free(id, true); + } + if (!options.onAutoRetry(id, name, responseToReport, xhr)) { + upload.cleanup(id, responseToReport, xhr); + } + } + }, + hasMoreParts: function(id) { + return !!handler._getFileState(id).chunking.remaining.length; + }, + nextPart: function(id) { + var nextIdx = handler._getFileState(id).chunking.remaining.shift(); + if (nextIdx >= handler._getTotalChunks(id)) { + nextIdx = null; + } + return nextIdx; + }, + reset: function(id) { + log("Server or callback has ordered chunking effort to be restarted on next attempt for item ID " + id, "error"); + handler._maybeDeletePersistedChunkData(id); + handler.reevaluateChunking(id); + handler._getFileState(id).loaded = 0; + handler._getFileState(id).attemptingResume = false; + }, + sendNext: function(id) { + var size = options.getSize(id), name = options.getName(id), chunkIdx = chunked.nextPart(id), chunkData = handler._getChunkData(id, chunkIdx), fileState = handler._getFileState(id), resuming = fileState.attemptingResume, inProgressChunks = fileState.chunking.inProgress || []; + if (fileState.loaded == null) { + fileState.loaded = 0; + } + if (resuming && options.onResume(id, name, chunkData, fileState.customResumeData) === false) { + chunked.reset(id); + chunkIdx = chunked.nextPart(id); + chunkData = handler._getChunkData(id, chunkIdx); + resuming = false; + } + if (chunkIdx == null && inProgressChunks.length === 0) { + chunked.finalize(id); + } else { + inProgressChunks.push(chunkIdx); + handler._getFileState(id).chunking.inProgress = inProgressChunks; + if (concurrentChunkingPossible) { + connectionManager.open(id, chunkIdx); + } + if (concurrentChunkingPossible && connectionManager.available() && handler._getFileState(id).chunking.remaining.length) { + chunked.sendNext(id); + } + if (chunkData.blob.size === 0) { + log(qq.format("Chunk {} for file {} will not be uploaded, zero sized chunk.", chunkIdx, id), "error"); + chunked.handleFailure(chunkIdx, id, "File is no longer available", null); + } + var onUploadChunkPromise = options.onUploadChunk(id, name, handler._getChunkDataForCallback(chunkData)); + onUploadChunkPromise.then(function(requestOverrides) { + if (!options.isInProgress(id)) { + log(qq.format("Not sending chunked upload request for item {}.{} - no longer in progress.", id, chunkIdx)); + } else { + log(qq.format("Sending chunked upload request for item {}.{}, bytes {}-{} of {}.", id, chunkIdx, chunkData.start + 1, chunkData.end, size)); + var uploadChunkData = { + chunkIdx: chunkIdx, + id: id, + overrides: requestOverrides, + resuming: resuming + }; + handler.uploadChunk(uploadChunkData).then(function success(response, xhr) { + log("Chunked upload request succeeded for " + id + ", chunk " + chunkIdx); + handler.clearCachedChunk(id, chunkIdx); + var inProgressChunks = handler._getFileState(id).chunking.inProgress || [], responseToReport = upload.normalizeResponse(response, true), inProgressChunkIdx = qq.indexOf(inProgressChunks, chunkIdx); + log(qq.format("Chunk {} for file {} uploaded successfully.", chunkIdx, id)); + chunked.done(id, chunkIdx, responseToReport, xhr); + if (inProgressChunkIdx >= 0) { + inProgressChunks.splice(inProgressChunkIdx, 1); + } + handler._maybePersistChunkedState(id); + if (!chunked.hasMoreParts(id) && inProgressChunks.length === 0) { + chunked.finalize(id); + } else if (chunked.hasMoreParts(id)) { + chunked.sendNext(id); + } else { + log(qq.format("File ID {} has no more chunks to send and these chunk indexes are still marked as in-progress: {}", id, JSON.stringify(inProgressChunks))); + } + }, function failure(response, xhr) { + chunked.handleFailure(chunkIdx, id, response, xhr); + }).done(function() { + handler.clearXhr(id, chunkIdx); + }); + } + }, function(error) { + chunked.handleFailure(chunkIdx, id, error, null); + }); + } + } + }, connectionManager = { + _open: [], + _openChunks: {}, + _waiting: [], + available: function() { + var max = options.maxConnections, openChunkEntriesCount = 0, openChunksCount = 0; + qq.each(connectionManager._openChunks, function(fileId, openChunkIndexes) { + openChunkEntriesCount++; + openChunksCount += openChunkIndexes.length; + }); + return max - (connectionManager._open.length - openChunkEntriesCount + openChunksCount); + }, + free: function(id, dontAllowNext) { + var allowNext = !dontAllowNext, waitingIndex = qq.indexOf(connectionManager._waiting, id), connectionsIndex = qq.indexOf(connectionManager._open, id), nextId; + delete connectionManager._openChunks[id]; + if (upload.getProxyOrBlob(id) instanceof qq.BlobProxy) { + log("Generated blob upload has ended for " + id + ", disposing generated blob."); + delete handler._getFileState(id).file; + } + if (waitingIndex >= 0) { + connectionManager._waiting.splice(waitingIndex, 1); + } else if (allowNext && connectionsIndex >= 0) { + connectionManager._open.splice(connectionsIndex, 1); + nextId = connectionManager._waiting.shift(); + if (nextId >= 0) { + connectionManager._open.push(nextId); + upload.start(nextId); + } + } + }, + getWaitingOrConnected: function() { + var waitingOrConnected = []; + qq.each(connectionManager._openChunks, function(fileId, chunks) { + if (chunks && chunks.length) { + waitingOrConnected.push(parseInt(fileId)); + } + }); + qq.each(connectionManager._open, function(idx, fileId) { + if (!connectionManager._openChunks[fileId]) { + waitingOrConnected.push(parseInt(fileId)); + } + }); + waitingOrConnected = waitingOrConnected.concat(connectionManager._waiting); + return waitingOrConnected; + }, + isUsingConnection: function(id) { + return qq.indexOf(connectionManager._open, id) >= 0; + }, + open: function(id, chunkIdx) { + if (chunkIdx == null) { + connectionManager._waiting.push(id); + } + if (connectionManager.available()) { + if (chunkIdx == null) { + connectionManager._waiting.pop(); + connectionManager._open.push(id); + } else { + (function() { + var openChunksEntry = connectionManager._openChunks[id] || []; + openChunksEntry.push(chunkIdx); + connectionManager._openChunks[id] = openChunksEntry; + })(); + } + return true; + } + return false; + }, + reset: function() { + connectionManager._waiting = []; + connectionManager._open = []; + } + }, simple = { + send: function(id, name) { + var fileState = handler._getFileState(id); + if (!fileState) { + log("Ignoring send request as this upload may have been cancelled, File ID " + id, "warn"); + return; + } + fileState.loaded = 0; + log("Sending simple upload request for " + id); + handler.uploadFile(id).then(function(response, optXhr) { + log("Simple upload request succeeded for " + id); + var responseToReport = upload.normalizeResponse(response, true), size = options.getSize(id); + options.onProgress(id, name, size, size); + upload.maybeNewUuid(id, responseToReport); + upload.cleanup(id, responseToReport, optXhr); + }, function(response, optXhr) { + log("Simple upload request failed for " + id); + var responseToReport = upload.normalizeResponse(response, false); + if (!options.onAutoRetry(id, name, responseToReport, optXhr)) { + upload.cleanup(id, responseToReport, optXhr); + } + }); + } + }, upload = { + cancel: function(id) { + log("Cancelling " + id); + options.paramsStore.remove(id); + connectionManager.free(id); + }, + cleanup: function(id, response, optXhr) { + var name = options.getName(id); + options.onComplete(id, name, response, optXhr); + if (handler._getFileState(id)) { + handler._clearXhrs && handler._clearXhrs(id); + } + connectionManager.free(id); + }, + getProxyOrBlob: function(id) { + return handler.getProxy && handler.getProxy(id) || handler.getFile && handler.getFile(id); + }, + initHandler: function() { + var handlerType = namespace ? qq[namespace] : qq.traditional, handlerModuleSubtype = qq.supportedFeatures.ajaxUploading ? "Xhr" : "Form"; + handler = new handlerType[handlerModuleSubtype + "UploadHandler"](options, { + getCustomResumeData: options.getCustomResumeData, + getDataByUuid: options.getDataByUuid, + getName: options.getName, + getSize: options.getSize, + getUuid: options.getUuid, + log: log, + onCancel: options.onCancel, + onProgress: options.onProgress, + onUuidChanged: options.onUuidChanged, + onFinalizing: function(id) { + options.setStatus(id, qq.status.UPLOAD_FINALIZING); + } + }); + if (handler._removeExpiredChunkingRecords) { + handler._removeExpiredChunkingRecords(); + } + }, + isDeferredEligibleForUpload: function(id) { + return options.isQueued(id); + }, + maybeDefer: function(id, blob) { + if (blob && !handler.getFile(id) && blob instanceof qq.BlobProxy) { + options.onUploadPrep(id); + log("Attempting to generate a blob on-demand for " + id); + blob.create().then(function(generatedBlob) { + log("Generated an on-demand blob for " + id); + handler.updateBlob(id, generatedBlob); + options.setSize(id, generatedBlob.size); + handler.reevaluateChunking(id); + upload.maybeSendDeferredFiles(id); + }, function(errorMessage) { + var errorResponse = {}; + if (errorMessage) { + errorResponse.error = errorMessage; + } + log(qq.format("Failed to generate blob for ID {}. Error message: {}.", id, errorMessage), "error"); + options.onComplete(id, options.getName(id), qq.extend(errorResponse, preventRetryResponse), null); + upload.maybeSendDeferredFiles(id); + connectionManager.free(id); + }); + } else { + return upload.maybeSendDeferredFiles(id); + } + return false; + }, + maybeSendDeferredFiles: function(id) { + var idsInGroup = options.getIdsInProxyGroup(id), uploadedThisId = false; + if (idsInGroup && idsInGroup.length) { + log("Maybe ready to upload proxy group file " + id); + qq.each(idsInGroup, function(idx, idInGroup) { + if (upload.isDeferredEligibleForUpload(idInGroup) && !!handler.getFile(idInGroup)) { + uploadedThisId = idInGroup === id; + upload.now(idInGroup); + } else if (upload.isDeferredEligibleForUpload(idInGroup)) { + return false; + } + }); + } else { + uploadedThisId = true; + upload.now(id); + } + return uploadedThisId; + }, + maybeNewUuid: function(id, response) { + if (response.newUuid !== undefined) { + options.onUuidChanged(id, response.newUuid); + } + }, + normalizeResponse: function(originalResponse, successful) { + var response = originalResponse; + if (!qq.isObject(originalResponse)) { + response = {}; + if (qq.isString(originalResponse) && !successful) { + response.error = originalResponse; + } + } + response.success = successful; + return response; + }, + now: function(id) { + var name = options.getName(id); + if (!controller.isValid(id)) { + throw new qq.Error(id + " is not a valid file ID to upload!"); + } + options.onUpload(id, name).then(function(response) { + if (response && response.pause) { + options.setStatus(id, qq.status.PAUSED); + handler.pause(id); + connectionManager.free(id); + } else { + if (chunkingPossible && handler._shouldChunkThisFile(id)) { + chunked.sendNext(id); + } else { + simple.send(id, name); + } + } + }, function(error) { + error = error || {}; + log(id + " upload start aborted due to rejected onUpload Promise - details: " + error, "error"); + if (!options.onAutoRetry(id, name, error.responseJSON || {})) { + var response = upload.normalizeResponse(error.responseJSON, false); + upload.cleanup(id, response); + } + }); + }, + start: function(id) { + var blobToUpload = upload.getProxyOrBlob(id); + if (blobToUpload) { + return upload.maybeDefer(id, blobToUpload); + } else { + upload.now(id); + return true; + } + } + }; + qq.extend(this, { + add: function(id, file) { + handler.add.apply(this, arguments); + }, + upload: function(id) { + if (connectionManager.open(id)) { + return upload.start(id); + } + return false; + }, + retry: function(id) { + if (concurrentChunkingPossible) { + handler._getFileState(id).temp.ignoreFailure = false; + } + if (connectionManager.isUsingConnection(id)) { + return upload.start(id); + } else { + return controller.upload(id); + } + }, + cancel: function(id) { + var cancelRetVal = handler.cancel(id); + if (qq.isGenericPromise(cancelRetVal)) { + cancelRetVal.then(function() { + upload.cancel(id); + }); + } else if (cancelRetVal !== false) { + upload.cancel(id); + } + }, + cancelAll: function() { + var waitingOrConnected = connectionManager.getWaitingOrConnected(), i; + if (waitingOrConnected.length) { + for (i = waitingOrConnected.length - 1; i >= 0; i--) { + controller.cancel(waitingOrConnected[i]); + } + } + connectionManager.reset(); + }, + getFile: function(id) { + if (handler.getProxy && handler.getProxy(id)) { + return handler.getProxy(id).referenceBlob; + } + return handler.getFile && handler.getFile(id); + }, + isProxied: function(id) { + return !!(handler.getProxy && handler.getProxy(id)); + }, + getInput: function(id) { + if (handler.getInput) { + return handler.getInput(id); + } + }, + reset: function() { + log("Resetting upload handler"); + controller.cancelAll(); + connectionManager.reset(); + handler.reset(); + }, + expunge: function(id) { + if (controller.isValid(id)) { + return handler.expunge(id); + } + }, + isValid: function(id) { + return handler.isValid(id); + }, + hasResumeRecord: function(id) { + var key = handler.isValid(id) && handler._getLocalStorageId && handler._getLocalStorageId(id); + if (key) { + return !!localStorage.getItem(key); + } + return false; + }, + getResumableFilesData: function() { + if (handler.getResumableFilesData) { + return handler.getResumableFilesData(); + } + return []; + }, + getThirdPartyFileId: function(id) { + if (controller.isValid(id)) { + return handler.getThirdPartyFileId(id); + } + }, + pause: function(id) { + if (controller.isResumable(id) && handler.pause && controller.isValid(id) && handler.pause(id)) { + connectionManager.free(id); + handler.moveInProgressToRemaining(id); + return true; + } + return false; + }, + isAttemptingResume: function(id) { + return !!handler.isAttemptingResume && handler.isAttemptingResume(id); + }, + isResumable: function(id) { + return !!handler.isResumable && handler.isResumable(id); + } + }); + qq.extend(options, o); + log = options.log; + chunkingPossible = options.chunking.enabled && qq.supportedFeatures.chunking; + concurrentChunkingPossible = chunkingPossible && options.chunking.concurrent.enabled; + preventRetryResponse = function() { + var response = {}; + response[options.preventRetryParam] = true; + return response; + }(); + upload.initHandler(); + }; + qq.WindowReceiveMessage = function(o) { + "use strict"; + var options = { + log: function(message, level) {} + }, callbackWrapperDetachers = {}; + qq.extend(options, o); + qq.extend(this, { + receiveMessage: function(id, callback) { + var onMessageCallbackWrapper = function(event) { + callback(event.data); + }; + if (window.postMessage) { + callbackWrapperDetachers[id] = qq(window).attach("message", onMessageCallbackWrapper); + } else { + log("iframe message passing not supported in this browser!", "error"); + } + }, + stopReceivingMessages: function(id) { + if (window.postMessage) { + var detacher = callbackWrapperDetachers[id]; + if (detacher) { + detacher(); + } + } + } + }); + }; + qq.FormUploadHandler = function(spec) { + "use strict"; + var options = spec.options, handler = this, proxy = spec.proxy, formHandlerInstanceId = qq.getUniqueId(), onloadCallbacks = {}, detachLoadEvents = {}, postMessageCallbackTimers = {}, isCors = options.isCors, inputName = options.inputName, getUuid = proxy.getUuid, log = proxy.log, corsMessageReceiver = new qq.WindowReceiveMessage({ + log: log + }); + function expungeFile(id) { + delete detachLoadEvents[id]; + if (isCors) { + clearTimeout(postMessageCallbackTimers[id]); + delete postMessageCallbackTimers[id]; + corsMessageReceiver.stopReceivingMessages(id); + } + var iframe = document.getElementById(handler._getIframeName(id)); + if (iframe) { + iframe.setAttribute("src", "javascript:false;"); + qq(iframe).remove(); + } + } + function getFileIdForIframeName(iframeName) { + return iframeName.split("_")[0]; + } + function initIframeForUpload(name) { + var iframe = qq.toElement(" {% endblock %} {% block bodyend %} diff --git a/templates/problem/raw.html b/templates/problem/raw.html index 573db37..bca3412 100644 --- a/templates/problem/raw.html +++ b/templates/problem/raw.html @@ -1,6 +1,8 @@ + + @@ -79,18 +81,18 @@
- {{ description|markdown('problem', 'tex' if math_engine == 'jax' else math_engine)|reference|absolutify(url)|str|safe }} + {{ description|markdown('problem', 'tex')|reference|absolutify(url)|str|safe }}
-{% if math_engine == 'jax' %} - - - -{% endif %} + + + + + diff --git a/templates/registration/registration_form.html b/templates/registration/registration_form.html index 220aa43..528145b 100644 --- a/templates/registration/registration_form.html +++ b/templates/registration/registration_form.html @@ -185,6 +185,9 @@
{{ _('Affiliated organizations') }}
{{ form.organizations }} + {% if form.organizations.errors %} +
{{ form.organizations.errors }}
+ {% endif %} {% if form.newsletter %}
{{ form.newsletter }} diff --git a/templates/stats/media-js.html b/templates/stats/media-js.html index 981ddff..69f9ad8 100644 --- a/templates/stats/media-js.html +++ b/templates/stats/media-js.html @@ -65,4 +65,26 @@ }, }); } + function draw_histogram(data, $chart) { + var ctx = $chart.find('canvas')[0].getContext('2d'); + ctx.canvas.height = 20 * data.labels.length + 100; + var chart = new Chart(ctx, { + type: 'bar', + data: data, + options: { + maintainAspectRatio: false, + legend: { + display: false, + }, + tooltips: { + callbacks: { + label: function(tooltipItem, data) { + return tooltipItem.value; + }, + }, + }, + }, + }); + return chart; + } diff --git a/templates/submission/info-base.html b/templates/submission/info-base.html index 53a5a4e..0511994 100644 --- a/templates/submission/info-base.html +++ b/templates/submission/info-base.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "common-content.html" %} {% block header %} diff --git a/templates/submission/source.html b/templates/submission/source.html index a3f0f50..f69331c 100644 --- a/templates/submission/source.html +++ b/templates/submission/source.html @@ -17,6 +17,10 @@ a:active .line .highlighter { background: rgba(255, 212, 0, 0.48); } + + .copy-clipboard { + margin-top: 0; + } {% endblock %} @@ -41,9 +45,9 @@

- +
- + + {% endif %} + {% endfor %} {% endfor %} +
+
{% for line in raw_source.split('\n') %} diff --git a/templates/submission/status-testcases.html b/templates/submission/status-testcases.html index f37eb79..77c4f09 100644 --- a/templates/submission/status-testcases.html +++ b/templates/submission/status-testcases.html @@ -25,67 +25,82 @@

{{ _('Execution Results') }}

{% endif %}
- {% set test_case_id = counter() %} + + + {% if submission.is_graded and submission.result != 'AB' %} + + + + + + + + + + + + + + + {% endif %} + + {% 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)) }}) -
-
+ {% set batch_AC = (batch.points == batch.total) %} +
+ + + + + + {% endif %} -
{{_('Overall: ')}} + {% 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=submission.points|roundfloat(3), + total=submission.problem.points|floatformat(-1)) }} + {% endif %} + {{submission.long_status}}{{_('Point: ')}} + {{ submission.case_points|floatformat(1) }}/{{ submission.case_total|floatformat(0) }} + + {{_('Time: ')}} + {% if submission.result == "TLE" %} + --- + {% else %} + {{ (submission.time * 1000)|floatformat(0) }} ms + {% endif %} + + {{_('Memory: ')}}{{ submission.memory|kbdetailformat }}
+ {{ _('Batch ') }}#{{ loop.index }} + + {% if batch_AC %} + + {% else %} + + {% endif %} + + + {{_('Point')}}: + + {{ _('%(points)s/%(total)s', points=batch.points|floatformat(1), total=batch.total|floatformat(0)) }} +
- {% if submission.is_graded %} - {% if submission.result != 'AB' %} - - - - - - - - - - - - - - - - {% endif %} - {% endif %} - {% for case in batch.cases %} @@ -95,9 +110,14 @@ - {% if not batch.id %} - - {% endif %} + + - {% if ((prefix_length is none or prefix_length > 0) or (request.user.is_superuser)) %} - - + - - {% endif %} - {% endfor %} -
{{_('Overall: ')}} - {% 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=submission.points|roundfloat(3), - total=submission.problem.points|floatformat(-1)) }} - {% endif %} - {{submission.long_status}}{{_('Point: ')}} - {{ submission.case_points|floatformat(1) }}/{{ submission.case_total|floatformat(0) }} - - {{_('Time: ')}} - {% if submission.result == "TLE" %} - --- - {% else %} - {{ (submission.time * 1000)|floatformat(0) }} ms - {% endif %} - - {{_('Memory: ')}}{{ submission.memory|kbdetailformat }}
- {%- if ((prefix_length is none or prefix_length > 0) or (request.user.is_superuser)) -%} + {%- if can_see_testcases -%} {%- endif -%} {%- if batch.id -%} {{ _('Case') }} #{{ loop.index }}: {%- elif is_pretest -%} - {{ _('Pretest') }} #{{ test_case_id() }}: + {{ _('Pretest') }} #{{ loop.index }}: {%- else -%} - {{ _('Test case') }} #{{ test_case_id() }}: + {{ _('Test case') }} #{{ loop.index }}: {%- endif -%} {{_('Point')}}: {{ case.points|floatformat }}/{{ case.total|floatformat(0) }}{{_('Point')}}: + {% if not batch.id %} + {{ case.points|floatformat }}/{{ case.total|floatformat(0) }} + {% else %} + - + {% endif %} + {%- if case.status != 'SC' -%} @@ -112,43 +132,41 @@ {% if case.status != 'SC' %}{{_('Memory')}}: {{ case.memory|kbdetailformat }}{% endif %}
+ + {{ _('Output:') }} +
{{ case.output|linebreaksbr }}
- {% if batch.id %}
{% endif %} -
+ {% if curr_data != null %} + {{ _('Answer:') }} +
{{ curr_data['answer']|linebreaksbr }}
+ {% endif %} + + {% if case.extended_feedback or case.feedback %} + {{ _('Judge feedback:') }} + {% if case.feedback %} +
{{ case.feedback|linebreaksbr }}
+ {% endif %} + {% if case.extended_feedback %} +
{{ case.extended_feedback|linebreaksbr }}
+ {% endif %} + {% endif %} + +
+ {% if submission.is_graded %}
{% if submission.result != "AB" %} diff --git a/templates/ticket/list.html b/templates/ticket/list.html index 4ec384c..9c5b3fd 100644 --- a/templates/ticket/list.html +++ b/templates/ticket/list.html @@ -254,7 +254,7 @@ {% if page_obj.num_pages > 1 %}
{% include "list-pages.html" %}
{% endif %} - +
diff --git a/templates/ticket/message.html b/templates/ticket/message.html index 0638e08..50954c2 100644 --- a/templates/ticket/message.html +++ b/templates/ticket/message.html @@ -1,15 +1,19 @@
- +
-
-
{{ message.time|date('DATE_FORMAT') }}
-
{{ message.time|time('TIME_FORMAT') }}
+ +
+
+
+
{{ message.time|date('DATE_FORMAT') }}
+
{{ message.time|time('TIME_FORMAT') }}
+
{{ message.body|markdown('ticket', MATH_ENGINE)|reference|str|safe }} diff --git a/templates/ticket/ticket.html b/templates/ticket/ticket.html index 760f0ca..4146115 100644 --- a/templates/ticket/ticket.html +++ b/templates/ticket/ticket.html @@ -24,13 +24,15 @@ width: 100%; margin: 0 auto; display: flex; - flex-direction: row-reverse; + flex-direction: row; + flex-wrap: wrap-reverse; max-width: 1000px; } .ticket-sidebar { flex: 1; padding: 10px 0 0 10px; + min-width: 150px; max-width: 200px; } @@ -103,13 +105,11 @@ } .message { - display: flex; margin-top: -40px; padding-top: 55px; } .message .info { - width: 130px; } .message .username { @@ -117,7 +117,8 @@ } .message .gravatar { - width: 80px; + width: 40px; + border-radius: 4px; display: block; margin: 0 auto; } @@ -130,6 +131,7 @@ border: 1px #999 solid; border-radius: 5px; flex: 1; + min-width: 200px; } .message .header { @@ -138,6 +140,11 @@ border-bottom: 1px solid #999; border-radius: 5px 5px 0 0; padding: 2px 7px; + display: inline-flex; + width: -webkit-fill-available; + } + + .message .send-time { text-align: right; } @@ -160,6 +167,15 @@ .new-message .submit, #edit-notes .submit { margin: 10px 0 0 auto; } + + .user-container { + display: inline-flex; + } + + .user-container .username { + padding-left: 0.5em; + padding-top: 1.65em; + } {% endblock %} @@ -259,13 +275,10 @@ } function ticket_message(ticket) { - console.log('Fetching data for: ' + ticket.message); $.ajax({ url: '{{ url('ticket_message_ajax', ticket.id) }}', data: {message: ticket.message}, success: function (data) { - console.log('Got data for: ' + ticket.message); - console.log(data); $('#messages').append($(data.message)); }, error: function (data) { @@ -283,7 +296,6 @@ return new EventReceiver( "{{ EVENT_DAEMON_LOCATION }}", "{{ EVENT_DAEMON_POLL_LOCATION }}", ['ticket-{{ ticket.id }}'], last_msg, function (message) { - console.log(message); switch (message.type) { case 'ticket-status': ticket_status(message); @@ -316,6 +328,35 @@ {% 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 }}
+ + +
+
+
- -
-
- {% 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 index eb73d10..19cc7f5 100644 --- a/templates/time-remaining-fragment.html +++ b/templates/time-remaining-fragment.html @@ -1,3 +1,3 @@ - - {{ countdown|timedelta("localized") }} + + {{ initial|timedelta("localized") }} \ No newline at end of file diff --git a/templates/user/base-users-table.html b/templates/user/base-users-table.html index bace862..9b75e49 100644 --- a/templates/user/base-users-table.html +++ b/templates/user/base-users-table.html @@ -17,7 +17,7 @@
{% for rank, user in users %} - + {% block after_rank scoped %}{% endblock %} {% block before_point scoped %}{% endblock %} diff --git a/templates/user/base-users.html b/templates/user/base-users.html index 8048cf3..5cb3ea7 100644 --- a/templates/user/base-users.html +++ b/templates/user/base-users.html @@ -50,11 +50,22 @@ } } }).trigger('hashchange'); + + $('.about-td').on('click', function() { + var max_height = $(this).css('max-height'); + if (max_height !== 'fit-content') { + $(this).css('max-height', 'fit-content'); + } + else { + $(this).css('max-height', '45px'); + } + }) }); {% endblock %} {% block media %} + {% block users_media %}{% endblock %} {% endblock %} diff --git a/templates/user/edit-profile.html b/templates/user/edit-profile.html index 44defe3..8bd2c2f 100644 --- a/templates/user/edit-profile.html +++ b/templates/user/edit-profile.html @@ -94,6 +94,16 @@ {% csrf_token %} + {% if edit_name_url %} +
+ + + {{_('Enter this form')}} + ({{_('It takes some time for admin to approve')}}) + +
+ {% endif %} +
{{ _('Self-description') }}:
{{ form.about }}
diff --git a/templates/user/import/index.html b/templates/user/import/index.html new file mode 100644 index 0000000..5f71b8a --- /dev/null +++ b/templates/user/import/index.html @@ -0,0 +1,111 @@ +{% extends "user/user-base.html" %} +{% block js_media %} + +{% endblock %} + +{% block body %} +{% csrf_token %} +
+ + + {{_('Sample')}} +
+ + +
+
+
+
{{ rank }}{{ rank }}{{ link_user(user) }} {% block user_data scoped %}{% endblock %}
+

+{% endblock %} diff --git a/templates/user/import/table_csv.html b/templates/user/import/table_csv.html new file mode 100644 index 0000000..5ab87ef --- /dev/null +++ b/templates/user/import/table_csv.html @@ -0,0 +1,24 @@ + + + {{_('ID')}} + {{_('Username')}} + {{_('Password')}} + {{_('Name')}} + {{_('School')}} + {{_('Email')}} + {{_('Organizations')}} + + + + {% for i in data %} + + {{loop.index}} + {{i.username}} + {{i.password}} + {{i.name}} + {{i.school}} + {{i.email}} + {{i.organizations}} + + {% endfor %} + diff --git a/templates/user/list.html b/templates/user/list.html index adf9e20..01cbb02 100644 --- a/templates/user/list.html +++ b/templates/user/list.html @@ -2,10 +2,17 @@ {% block users_media %} {% endblock %} diff --git a/templates/user/user-about.html b/templates/user/user-about.html index 0b06c58..748b3cb 100644 --- a/templates/user/user-about.html +++ b/templates/user/user-about.html @@ -9,23 +9,59 @@ {% block user_content %}
- {% if request.user != user.user %} -
- {% csrf_token %} - -
+ + {% if user.user.first_name %} +

+ {{user.user.first_name}}{% if user.user.last_name %} ({{user.user.last_name}}){% endif %} +

{% endif %} {% with orgs=user.organizations.all() %} {% if orgs %} -

{{ _('From') }} +

{{ _('From') }} {% for org in orgs -%} {{ org.name }} {%- if not loop.last %}, {% endif %} @@ -59,6 +95,26 @@
{% endif %} + {% if awards %} +
+

+

{{_('Awards')}}

+ {% for medal in awards.medals %} + {% if medal.ranking == 1 %} + {% set medal_url = static('awards/gold-medal.png') %} + {% elif medal.ranking == 2%} + {% set medal_url = static('awards/silver-medal.png') %} + {% else %} + {% set medal_url = static('awards/bronze-medal.png') %} + {% endif %} + + + + {% endfor%} +
+ {% endif %} +

{% if rating %} -

Rating History

+
+

{{_('Rating History')}}

@@ -212,13 +269,11 @@ var sum_activity = days.map(obj => obj.activity).reduce((a, b) => a + b, 0); $div.find('#submission-total-count').text( - ngettext("%(cnt)d total submission", "%(cnt)d total submissions", sum_activity) - .replace("%(cnt)d", sum_activity) + sum_activity + " " + "{{_('total submission(s)')}}" ) if (year == current_year) { $('#submission-activity-header').text( - ngettext("%(cnt)d submission in the last year", "%(cnt)d submissions in the last year", sum_activity) - .replace("%(cnt)d", sum_activity) + sum_activity + " " + "{{_('submissions in the last year')}}" ) } @@ -230,7 +285,6 @@ $div.find('#submission-' + current_weekday) .append($('').addClass('activity-blank').append('
')); } - days.forEach(obj => { var level = activity_breakdown.findIndex(x => x >= obj.activity); var text = @@ -413,26 +467,31 @@ }, { begin: 1000, - end: 1200, + end: 1400, color: 'rgb(0, 169, 0, 0.4)' }, { - begin: 1200, - end: 1500, + begin: 1400, + end: 1700, + color: 'rgb(3, 168, 158, 0.4)' + }, + { + begin: 1700, + end: 1900, color: 'rgb(0, 0, 255, 0.4)' }, { - begin: 1500, - end: 1800, + begin: 1900, + end: 2100, color: 'rgb(128, 0, 128, 0.37)' }, { - begin: 1800, - end: 2200, + begin: 2100, + end: 2400, color: 'rgb(255, 177, 0, 0.4)' }, { - begin: 2200, + begin: 2400, end: 3000, color: 'rgb(238, 0, 0, 0.4)' }, diff --git a/templates/user/user-base.html b/templates/user/user-base.html index 5f273f2..42407e4 100644 --- a/templates/user/user-base.html +++ b/templates/user/user-base.html @@ -23,6 +23,61 @@ display: -ms-flexbox; display: flex; } + + .user-info { + font-size: 1.4em; + line-height: 1.225; + font-weight: 500; + } + + .user-info-header { + color: gray; + } + + .user-info-container { + display: grid; + grid-column-gap: .5rem; + grid-row-gap: 1rem; + grid-template-columns: repeat(6, minmax(10rem, 1fr)); + } + + .user-info-card { + align-items: center; + text-align: center; + display: flex; + flex-direction: column; + padding: 1rem; + } + + .user-info-body { + font-weight: bold; + } + + @media (max-width: 500px) { + .user-info-container { + grid-template-columns: repeat(2, minmax(10rem, 1fr)); + } + } + + .user-stat { + text-align: right; + font-weight: bold; + margin-right: 0.5em; + } + + .user-stat-container { + margin-bottom: 0.5em; + } + + .user-stat-header { + color: gray; + } + + #awards img { + height: 105px; + margin-right: 1em; + margin-left: 1em; + } {% endblock %} @@ -37,40 +92,53 @@

- -
- {%- trans trimmed counter=user.problem_count %} - {{ counter }} problem solved - {% pluralize %} - {{ counter }} problems solved - {% endtrans -%} -
- - {% if not user.is_unlisted %} -
{{ _('Rank by points:') }} #{{ rank }}
+ {% if request.user != user.user %} +
+ {% csrf_token %} + +
{% endif %} -
- {{ _('Total points:') }} - - {{ user.performance_points|floatformat(0) }} - -
-
+ {% if request.user.is_authenticated %} +
+
+
+ {% csrf_token %} + + +
+
+ {% endif %} {% if ratings %}
-
{{ ratings|length }} contests written
- {% if not user.is_unlisted %} -
{{ _('Rank by rating:') }} #{{ rating_rank }}
- {% endif %} -
{{ _('Rating:') }} {{ rating_number(rating) }}
-
{{ _('Volatility:') }} {{ rating.volatility }}
-
{{ _('Min. rating:') }} {{ rating_number(min_rating) }}
-
{{ _('Max rating:') }} {{ rating_number(max_rating) }}
+
+
+
{{_('Contests written')}}:
+
{{ratings|length}}
+
+
+
{{ _('Min. rating:') }}
+
{{ rating_number(min_rating) }}
+
+
+
{{ _('Max rating:') }}
+
{{ rating_number(max_rating) }}
+
+
{% endif %}
{% block user_content %}{% endblock %}
diff --git a/templates/user/user-list-tabs.html b/templates/user/user-list-tabs.html index 8288c53..9acd5d4 100644 --- a/templates/user/user-list-tabs.html +++ b/templates/user/user-list-tabs.html @@ -4,4 +4,7 @@ {{ make_tab('list', 'fa-trophy', url('user_list'), _('Leaderboard')) }} {{ make_tab('friends', 'fa-users', url('user_list') + '?friend=true', _('Friends')) }} {{ make_tab('organizations', 'fa-university', url('organization_list'), _('Organizations')) }} + {% if request.user.is_superuser %} + {{ make_tab('import', 'fa-table', url('import_users'), _('Import')) }} + {% endif %} {% endblock %} diff --git a/templates/user/users-table.html b/templates/user/users-table.html index 2a9e31c..8e0bf13 100644 --- a/templates/user/users-table.html +++ b/templates/user/users-table.html @@ -1,6 +1,7 @@ {% extends "user/base-users-table.html" %} {% block after_rank_head %} + {% if sort_links %}{% endif %} @@ -10,19 +11,16 @@ {%- if sort_links %}{{ sort_order.rating }}{% endif %} - {{ _('Full Name') }} {% endblock %} {% block after_rank %} - {% if user.rating %}{{ rating_number(user) }}{% endif %} - - {% if user.user.first_name %} - - {{ user.user.first_name }} - - {% endif %} - + + {% if user.rating %}{{ rating_number(user) }}{% endif %} +{% endblock %} + +{% block user_data %} +{{ "- (" + user.user.first_name + ")" if user.user.first_name else ''}} {% endblock %} {% block after_point_head %} @@ -31,8 +29,18 @@ {{ _('Problems') }} {%- if sort_links %}{{ sort_order.problem_count }}{% endif %} + {{ _('About') }} {% endblock %} {% block after_point %} - {{ user.problem_count }} + {{ user.problem_count }} + +
+ {% if user.about %} + {% cache 86400 'user_about' user.id MATH_ENGINE %} + {{ user.about|markdown('self-description', MATH_ENGINE)|reference|str|safe }} + {% endcache %} + {% endif %} +
+ {% endblock %} diff --git a/templates/widgets/fine_uploader.html b/templates/widgets/fine_uploader.html new file mode 100644 index 0000000..ef28f41 --- /dev/null +++ b/templates/widgets/fine_uploader.html @@ -0,0 +1,4 @@ +{% if widget.is_initial %} +{{ widget.initial_text }}: {{ widget.value }} +{% endif %} +