##// END OF EJS Templates
Plural in form error
neko259 -
r1333:1b1542f7 default
parent child Browse files
Show More
@@ -1,364 +1,365 b''
1 import hashlib
1 import hashlib
2 import re
2 import re
3 import time
3 import time
4
4
5 import pytz
5 import pytz
6 from django import forms
6 from django import forms
7 from django.core.files.uploadedfile import SimpleUploadedFile
7 from django.core.files.uploadedfile import SimpleUploadedFile
8 from django.core.exceptions import ObjectDoesNotExist
8 from django.core.exceptions import ObjectDoesNotExist
9 from django.forms.util import ErrorList
9 from django.forms.util import ErrorList
10 from django.utils.translation import ugettext_lazy as _
10 from django.utils.translation import ugettext_lazy as _, ungettext_lazy
11
11
12 from boards.mdx_neboard import formatters
12 from boards.mdx_neboard import formatters
13 from boards.models.attachment.downloaders import Downloader
13 from boards.models.attachment.downloaders import Downloader
14 from boards.models.post import TITLE_MAX_LENGTH
14 from boards.models.post import TITLE_MAX_LENGTH
15 from boards.models import Tag, Post
15 from boards.models import Tag, Post
16 from boards.utils import validate_file_size
16 from boards.utils import validate_file_size
17 from neboard import settings
17 from neboard import settings
18 import boards.settings as board_settings
18 import boards.settings as board_settings
19 import neboard
19 import neboard
20
20
21 REGEX_TAGS = re.compile(r'^[\w\s\d]+$', re.UNICODE)
21 REGEX_TAGS = re.compile(r'^[\w\s\d]+$', re.UNICODE)
22
22
23 VETERAN_POSTING_DELAY = 5
23 VETERAN_POSTING_DELAY = 5
24
24
25 ATTRIBUTE_PLACEHOLDER = 'placeholder'
25 ATTRIBUTE_PLACEHOLDER = 'placeholder'
26 ATTRIBUTE_ROWS = 'rows'
26 ATTRIBUTE_ROWS = 'rows'
27
27
28 LAST_POST_TIME = 'last_post_time'
28 LAST_POST_TIME = 'last_post_time'
29 LAST_LOGIN_TIME = 'last_login_time'
29 LAST_LOGIN_TIME = 'last_login_time'
30 TEXT_PLACEHOLDER = _('Type message here. Use formatting panel for more advanced usage.')
30 TEXT_PLACEHOLDER = _('Type message here. Use formatting panel for more advanced usage.')
31 TAGS_PLACEHOLDER = _('music images i_dont_like_tags')
31 TAGS_PLACEHOLDER = _('music images i_dont_like_tags')
32
32
33 LABEL_TITLE = _('Title')
33 LABEL_TITLE = _('Title')
34 LABEL_TEXT = _('Text')
34 LABEL_TEXT = _('Text')
35 LABEL_TAG = _('Tag')
35 LABEL_TAG = _('Tag')
36 LABEL_SEARCH = _('Search')
36 LABEL_SEARCH = _('Search')
37
37
38 ERROR_SPEED = _('Please wait %s seconds before sending message')
38 ERROR_SPEED = 'Please wait %(delay)d second before sending message'
39 ERROR_SPEED_PLURAL = 'Please wait %(delay)d seconds before sending message'
39
40
40 TAG_MAX_LENGTH = 20
41 TAG_MAX_LENGTH = 20
41
42
42 TEXTAREA_ROWS = 4
43 TEXTAREA_ROWS = 4
43
44
44
45
45 def get_timezones():
46 def get_timezones():
46 timezones = []
47 timezones = []
47 for tz in pytz.common_timezones:
48 for tz in pytz.common_timezones:
48 timezones.append((tz, tz),)
49 timezones.append((tz, tz),)
49 return timezones
50 return timezones
50
51
51
52
52 class FormatPanel(forms.Textarea):
53 class FormatPanel(forms.Textarea):
53 """
54 """
54 Panel for text formatting. Consists of buttons to add different tags to the
55 Panel for text formatting. Consists of buttons to add different tags to the
55 form text area.
56 form text area.
56 """
57 """
57
58
58 def render(self, name, value, attrs=None):
59 def render(self, name, value, attrs=None):
59 output = '<div id="mark-panel">'
60 output = '<div id="mark-panel">'
60 for formatter in formatters:
61 for formatter in formatters:
61 output += '<span class="mark_btn"' + \
62 output += '<span class="mark_btn"' + \
62 ' onClick="addMarkToMsg(\'' + formatter.format_left + \
63 ' onClick="addMarkToMsg(\'' + formatter.format_left + \
63 '\', \'' + formatter.format_right + '\')">' + \
64 '\', \'' + formatter.format_right + '\')">' + \
64 formatter.preview_left + formatter.name + \
65 formatter.preview_left + formatter.name + \
65 formatter.preview_right + '</span>'
66 formatter.preview_right + '</span>'
66
67
67 output += '</div>'
68 output += '</div>'
68 output += super(FormatPanel, self).render(name, value, attrs=None)
69 output += super(FormatPanel, self).render(name, value, attrs=None)
69
70
70 return output
71 return output
71
72
72
73
73 class PlainErrorList(ErrorList):
74 class PlainErrorList(ErrorList):
74 def __unicode__(self):
75 def __unicode__(self):
75 return self.as_text()
76 return self.as_text()
76
77
77 def as_text(self):
78 def as_text(self):
78 return ''.join(['(!) %s ' % e for e in self])
79 return ''.join(['(!) %s ' % e for e in self])
79
80
80
81
81 class NeboardForm(forms.Form):
82 class NeboardForm(forms.Form):
82 """
83 """
83 Form with neboard-specific formatting.
84 Form with neboard-specific formatting.
84 """
85 """
85
86
86 def as_div(self):
87 def as_div(self):
87 """
88 """
88 Returns this form rendered as HTML <as_div>s.
89 Returns this form rendered as HTML <as_div>s.
89 """
90 """
90
91
91 return self._html_output(
92 return self._html_output(
92 # TODO Do not show hidden rows in the list here
93 # TODO Do not show hidden rows in the list here
93 normal_row='<div class="form-row">'
94 normal_row='<div class="form-row">'
94 '<div class="form-label">'
95 '<div class="form-label">'
95 '%(label)s'
96 '%(label)s'
96 '</div>'
97 '</div>'
97 '<div class="form-input">'
98 '<div class="form-input">'
98 '%(field)s'
99 '%(field)s'
99 '</div>'
100 '</div>'
100 '</div>'
101 '</div>'
101 '<div class="form-row">'
102 '<div class="form-row">'
102 '%(help_text)s'
103 '%(help_text)s'
103 '</div>',
104 '</div>',
104 error_row='<div class="form-row">'
105 error_row='<div class="form-row">'
105 '<div class="form-label"></div>'
106 '<div class="form-label"></div>'
106 '<div class="form-errors">%s</div>'
107 '<div class="form-errors">%s</div>'
107 '</div>',
108 '</div>',
108 row_ender='</div>',
109 row_ender='</div>',
109 help_text_html='%s',
110 help_text_html='%s',
110 errors_on_separate_row=True)
111 errors_on_separate_row=True)
111
112
112 def as_json_errors(self):
113 def as_json_errors(self):
113 errors = []
114 errors = []
114
115
115 for name, field in list(self.fields.items()):
116 for name, field in list(self.fields.items()):
116 if self[name].errors:
117 if self[name].errors:
117 errors.append({
118 errors.append({
118 'field': name,
119 'field': name,
119 'errors': self[name].errors.as_text(),
120 'errors': self[name].errors.as_text(),
120 })
121 })
121
122
122 return errors
123 return errors
123
124
124
125
125 class PostForm(NeboardForm):
126 class PostForm(NeboardForm):
126
127
127 title = forms.CharField(max_length=TITLE_MAX_LENGTH, required=False,
128 title = forms.CharField(max_length=TITLE_MAX_LENGTH, required=False,
128 label=LABEL_TITLE,
129 label=LABEL_TITLE,
129 widget=forms.TextInput(
130 widget=forms.TextInput(
130 attrs={ATTRIBUTE_PLACEHOLDER:
131 attrs={ATTRIBUTE_PLACEHOLDER:
131 'test#tripcode'}))
132 'test#tripcode'}))
132 text = forms.CharField(
133 text = forms.CharField(
133 widget=FormatPanel(attrs={
134 widget=FormatPanel(attrs={
134 ATTRIBUTE_PLACEHOLDER: TEXT_PLACEHOLDER,
135 ATTRIBUTE_PLACEHOLDER: TEXT_PLACEHOLDER,
135 ATTRIBUTE_ROWS: TEXTAREA_ROWS,
136 ATTRIBUTE_ROWS: TEXTAREA_ROWS,
136 }),
137 }),
137 required=False, label=LABEL_TEXT)
138 required=False, label=LABEL_TEXT)
138 file = forms.FileField(required=False, label=_('File'),
139 file = forms.FileField(required=False, label=_('File'),
139 widget=forms.ClearableFileInput(
140 widget=forms.ClearableFileInput(
140 attrs={'accept': 'file/*'}))
141 attrs={'accept': 'file/*'}))
141 file_url = forms.CharField(required=False, label=_('File URL'),
142 file_url = forms.CharField(required=False, label=_('File URL'),
142 widget=forms.TextInput(
143 widget=forms.TextInput(
143 attrs={ATTRIBUTE_PLACEHOLDER:
144 attrs={ATTRIBUTE_PLACEHOLDER:
144 'http://example.com/image.png'}))
145 'http://example.com/image.png'}))
145
146
146 # This field is for spam prevention only
147 # This field is for spam prevention only
147 email = forms.CharField(max_length=100, required=False, label=_('e-mail'),
148 email = forms.CharField(max_length=100, required=False, label=_('e-mail'),
148 widget=forms.TextInput(attrs={
149 widget=forms.TextInput(attrs={
149 'class': 'form-email'}))
150 'class': 'form-email'}))
150 threads = forms.CharField(required=False, label=_('Additional threads'),
151 threads = forms.CharField(required=False, label=_('Additional threads'),
151 widget=forms.TextInput(attrs={ATTRIBUTE_PLACEHOLDER:
152 widget=forms.TextInput(attrs={ATTRIBUTE_PLACEHOLDER:
152 '123 456 789'}))
153 '123 456 789'}))
153
154
154 session = None
155 session = None
155 need_to_ban = False
156 need_to_ban = False
156
157
157 def clean_title(self):
158 def clean_title(self):
158 title = self.cleaned_data['title']
159 title = self.cleaned_data['title']
159 if title:
160 if title:
160 if len(title) > TITLE_MAX_LENGTH:
161 if len(title) > TITLE_MAX_LENGTH:
161 raise forms.ValidationError(_('Title must have less than %s '
162 raise forms.ValidationError(_('Title must have less than %s '
162 'characters') %
163 'characters') %
163 str(TITLE_MAX_LENGTH))
164 str(TITLE_MAX_LENGTH))
164 return title
165 return title
165
166
166 def clean_text(self):
167 def clean_text(self):
167 text = self.cleaned_data['text'].strip()
168 text = self.cleaned_data['text'].strip()
168 if text:
169 if text:
169 max_length = board_settings.get_int('Forms', 'MaxTextLength')
170 max_length = board_settings.get_int('Forms', 'MaxTextLength')
170 if len(text) > max_length:
171 if len(text) > max_length:
171 raise forms.ValidationError(_('Text must have less than %s '
172 raise forms.ValidationError(_('Text must have less than %s '
172 'characters') % str(max_length))
173 'characters') % str(max_length))
173 return text
174 return text
174
175
175 def clean_file(self):
176 def clean_file(self):
176 file = self.cleaned_data['file']
177 file = self.cleaned_data['file']
177
178
178 if file:
179 if file:
179 validate_file_size(file.size)
180 validate_file_size(file.size)
180
181
181 return file
182 return file
182
183
183 def clean_file_url(self):
184 def clean_file_url(self):
184 url = self.cleaned_data['file_url']
185 url = self.cleaned_data['file_url']
185
186
186 file = None
187 file = None
187 if url:
188 if url:
188 file = self._get_file_from_url(url)
189 file = self._get_file_from_url(url)
189
190
190 if not file:
191 if not file:
191 raise forms.ValidationError(_('Invalid URL'))
192 raise forms.ValidationError(_('Invalid URL'))
192 else:
193 else:
193 validate_file_size(file.size)
194 validate_file_size(file.size)
194
195
195 return file
196 return file
196
197
197 def clean_threads(self):
198 def clean_threads(self):
198 threads_str = self.cleaned_data['threads']
199 threads_str = self.cleaned_data['threads']
199
200
200 if len(threads_str) > 0:
201 if len(threads_str) > 0:
201 threads_id_list = threads_str.split(' ')
202 threads_id_list = threads_str.split(' ')
202
203
203 threads = list()
204 threads = list()
204
205
205 for thread_id in threads_id_list:
206 for thread_id in threads_id_list:
206 try:
207 try:
207 thread = Post.objects.get(id=int(thread_id))
208 thread = Post.objects.get(id=int(thread_id))
208 if not thread.is_opening() or thread.get_thread().archived:
209 if not thread.is_opening() or thread.get_thread().archived:
209 raise ObjectDoesNotExist()
210 raise ObjectDoesNotExist()
210 threads.append(thread)
211 threads.append(thread)
211 except (ObjectDoesNotExist, ValueError):
212 except (ObjectDoesNotExist, ValueError):
212 raise forms.ValidationError(_('Invalid additional thread list'))
213 raise forms.ValidationError(_('Invalid additional thread list'))
213
214
214 return threads
215 return threads
215
216
216 def clean(self):
217 def clean(self):
217 cleaned_data = super(PostForm, self).clean()
218 cleaned_data = super(PostForm, self).clean()
218
219
219 if cleaned_data['email']:
220 if cleaned_data['email']:
220 self.need_to_ban = True
221 self.need_to_ban = True
221 raise forms.ValidationError('A human cannot enter a hidden field')
222 raise forms.ValidationError('A human cannot enter a hidden field')
222
223
223 if not self.errors:
224 if not self.errors:
224 self._clean_text_file()
225 self._clean_text_file()
225
226
226 if not self.errors and self.session:
227 if not self.errors and self.session:
227 self._validate_posting_speed()
228 self._validate_posting_speed()
228
229
229 return cleaned_data
230 return cleaned_data
230
231
231 def get_file(self):
232 def get_file(self):
232 """
233 """
233 Gets file from form or URL.
234 Gets file from form or URL.
234 """
235 """
235
236
236 file = self.cleaned_data['file']
237 file = self.cleaned_data['file']
237 return file or self.cleaned_data['file_url']
238 return file or self.cleaned_data['file_url']
238
239
239 def get_tripcode(self):
240 def get_tripcode(self):
240 title = self.cleaned_data['title']
241 title = self.cleaned_data['title']
241 if title is not None and '#' in title:
242 if title is not None and '#' in title:
242 code = title.split('#', maxsplit=1)[1] + neboard.settings.SECRET_KEY
243 code = title.split('#', maxsplit=1)[1] + neboard.settings.SECRET_KEY
243 return hashlib.md5(code.encode()).hexdigest()
244 return hashlib.md5(code.encode()).hexdigest()
244
245
245 def get_title(self):
246 def get_title(self):
246 title = self.cleaned_data['title']
247 title = self.cleaned_data['title']
247 if title is not None and '#' in title:
248 if title is not None and '#' in title:
248 return title.split('#', maxsplit=1)[0]
249 return title.split('#', maxsplit=1)[0]
249 else:
250 else:
250 return title
251 return title
251
252
252 def _clean_text_file(self):
253 def _clean_text_file(self):
253 text = self.cleaned_data.get('text')
254 text = self.cleaned_data.get('text')
254 file = self.get_file()
255 file = self.get_file()
255
256
256 if (not text) and (not file):
257 if (not text) and (not file):
257 error_message = _('Either text or file must be entered.')
258 error_message = _('Either text or file must be entered.')
258 self._errors['text'] = self.error_class([error_message])
259 self._errors['text'] = self.error_class([error_message])
259
260
260 def _validate_posting_speed(self):
261 def _validate_posting_speed(self):
261 can_post = True
262 can_post = True
262
263
263 posting_delay = settings.POSTING_DELAY
264 posting_delay = settings.POSTING_DELAY
264
265
265 if board_settings.get_bool('Forms', 'LimitPostingSpeed'):
266 if board_settings.get_bool('Forms', 'LimitPostingSpeed'):
266 now = time.time()
267 now = time.time()
267
268
268 current_delay = 0
269 current_delay = 0
269 need_delay = False
270
270
271 if not LAST_POST_TIME in self.session:
271 if LAST_POST_TIME not in self.session:
272 self.session[LAST_POST_TIME] = now
272 self.session[LAST_POST_TIME] = now
273
273
274 need_delay = True
274 need_delay = True
275 else:
275 else:
276 last_post_time = self.session.get(LAST_POST_TIME)
276 last_post_time = self.session.get(LAST_POST_TIME)
277 current_delay = int(now - last_post_time)
277 current_delay = int(now - last_post_time)
278
278
279 need_delay = current_delay < posting_delay
279 need_delay = current_delay < posting_delay
280
280
281 if need_delay:
281 if need_delay:
282 error_message = ERROR_SPEED % str(posting_delay
282 delay = posting_delay - current_delay
283 - current_delay)
283 error_message = ungettext_lazy(ERROR_SPEED, ERROR_SPEED_PLURAL,
284 delay) % {'delay': delay}
284 self._errors['text'] = self.error_class([error_message])
285 self._errors['text'] = self.error_class([error_message])
285
286
286 can_post = False
287 can_post = False
287
288
288 if can_post:
289 if can_post:
289 self.session[LAST_POST_TIME] = now
290 self.session[LAST_POST_TIME] = now
290
291
291 def _get_file_from_url(self, url: str) -> SimpleUploadedFile:
292 def _get_file_from_url(self, url: str) -> SimpleUploadedFile:
292 """
293 """
293 Gets an file file from URL.
294 Gets an file file from URL.
294 """
295 """
295
296
296 img_temp = None
297 img_temp = None
297
298
298 try:
299 try:
299 for downloader in Downloader.__subclasses__():
300 for downloader in Downloader.__subclasses__():
300 if downloader.handles(url):
301 if downloader.handles(url):
301 return downloader.download(url)
302 return downloader.download(url)
302 # If nobody of the specific downloaders handles this, use generic
303 # If nobody of the specific downloaders handles this, use generic
303 # one
304 # one
304 return Downloader.download(url)
305 return Downloader.download(url)
305 except forms.ValidationError as e:
306 except forms.ValidationError as e:
306 raise e
307 raise e
307 except Exception as e:
308 except Exception as e:
308 # Just return no file
309 # Just return no file
309 pass
310 pass
310
311
311
312
312 class ThreadForm(PostForm):
313 class ThreadForm(PostForm):
313
314
314 tags = forms.CharField(
315 tags = forms.CharField(
315 widget=forms.TextInput(attrs={ATTRIBUTE_PLACEHOLDER: TAGS_PLACEHOLDER}),
316 widget=forms.TextInput(attrs={ATTRIBUTE_PLACEHOLDER: TAGS_PLACEHOLDER}),
316 max_length=100, label=_('Tags'), required=True)
317 max_length=100, label=_('Tags'), required=True)
317
318
318 def clean_tags(self):
319 def clean_tags(self):
319 tags = self.cleaned_data['tags'].strip()
320 tags = self.cleaned_data['tags'].strip()
320
321
321 if not tags or not REGEX_TAGS.match(tags):
322 if not tags or not REGEX_TAGS.match(tags):
322 raise forms.ValidationError(
323 raise forms.ValidationError(
323 _('Inappropriate characters in tags.'))
324 _('Inappropriate characters in tags.'))
324
325
325 required_tag_exists = False
326 required_tag_exists = False
326 for tag in tags.split():
327 for tag in tags.split():
327 try:
328 try:
328 Tag.objects.get(name=tag.strip().lower(), required=True)
329 Tag.objects.get(name=tag.strip().lower(), required=True)
329 required_tag_exists = True
330 required_tag_exists = True
330 break
331 break
331 except ObjectDoesNotExist:
332 except ObjectDoesNotExist:
332 pass
333 pass
333
334
334 if not required_tag_exists:
335 if not required_tag_exists:
335 all_tags = Tag.objects.filter(required=True)
336 all_tags = Tag.objects.filter(required=True)
336 raise forms.ValidationError(
337 raise forms.ValidationError(
337 _('Need at least one section.'))
338 _('Need at least one section.'))
338
339
339 return tags
340 return tags
340
341
341 def clean(self):
342 def clean(self):
342 cleaned_data = super(ThreadForm, self).clean()
343 cleaned_data = super(ThreadForm, self).clean()
343
344
344 return cleaned_data
345 return cleaned_data
345
346
346
347
347 class SettingsForm(NeboardForm):
348 class SettingsForm(NeboardForm):
348
349
349 theme = forms.ChoiceField(choices=settings.THEMES, label=_('Theme'))
350 theme = forms.ChoiceField(choices=settings.THEMES, label=_('Theme'))
350 image_viewer = forms.ChoiceField(choices=settings.IMAGE_VIEWERS, label=_('Image view mode'))
351 image_viewer = forms.ChoiceField(choices=settings.IMAGE_VIEWERS, label=_('Image view mode'))
351 username = forms.CharField(label=_('User name'), required=False)
352 username = forms.CharField(label=_('User name'), required=False)
352 timezone = forms.ChoiceField(choices=get_timezones(), label=_('Time zone'))
353 timezone = forms.ChoiceField(choices=get_timezones(), label=_('Time zone'))
353
354
354 def clean_username(self):
355 def clean_username(self):
355 username = self.cleaned_data['username']
356 username = self.cleaned_data['username']
356
357
357 if username and not REGEX_TAGS.match(username):
358 if username and not REGEX_TAGS.match(username):
358 raise forms.ValidationError(_('Inappropriate characters.'))
359 raise forms.ValidationError(_('Inappropriate characters.'))
359
360
360 return username
361 return username
361
362
362
363
363 class SearchForm(NeboardForm):
364 class SearchForm(NeboardForm):
364 query = forms.CharField(max_length=500, label=LABEL_SEARCH, required=False)
365 query = forms.CharField(max_length=500, label=LABEL_SEARCH, required=False)
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -1,472 +1,473 b''
1 # SOME DESCRIPTIVE TITLE.
1 # SOME DESCRIPTIVE TITLE.
2 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
2 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 # This file is distributed under the same license as the PACKAGE package.
3 # This file is distributed under the same license as the PACKAGE package.
4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5 #
5 #
6 msgid ""
6 msgid ""
7 msgstr ""
7 msgstr ""
8 "Project-Id-Version: PACKAGE VERSION\n"
8 "Project-Id-Version: PACKAGE VERSION\n"
9 "Report-Msgid-Bugs-To: \n"
9 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2015-09-04 19:00+0300\n"
10 "POT-Creation-Date: 2015-09-05 22:33+0300\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
14 "Language: ru\n"
14 "Language: ru\n"
15 "MIME-Version: 1.0\n"
15 "MIME-Version: 1.0\n"
16 "Content-Type: text/plain; charset=UTF-8\n"
16 "Content-Type: text/plain; charset=UTF-8\n"
17 "Content-Transfer-Encoding: 8bit\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
18 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20
20
21 #: admin.py:22
21 #: admin.py:22
22 msgid "{} posters were banned"
22 msgid "{} posters were banned"
23 msgstr ""
23 msgstr ""
24
24
25 #: authors.py:9
25 #: authors.py:9
26 msgid "author"
26 msgid "author"
27 msgstr "Π°Π²Ρ‚ΠΎΡ€"
27 msgstr "Π°Π²Ρ‚ΠΎΡ€"
28
28
29 #: authors.py:10
29 #: authors.py:10
30 msgid "developer"
30 msgid "developer"
31 msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ"
31 msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ"
32
32
33 #: authors.py:11
33 #: authors.py:11
34 msgid "javascript developer"
34 msgid "javascript developer"
35 msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ javascript"
35 msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ javascript"
36
36
37 #: authors.py:12
37 #: authors.py:12
38 msgid "designer"
38 msgid "designer"
39 msgstr "Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€"
39 msgstr "Π΄ΠΈΠ·Π°ΠΉΠ½Π΅Ρ€"
40
40
41 #: forms.py:30
41 #: forms.py:30
42 msgid "Type message here. Use formatting panel for more advanced usage."
42 msgid "Type message here. Use formatting panel for more advanced usage."
43 msgstr ""
43 msgstr ""
44 "Π’Π²ΠΎΠ΄ΠΈΡ‚Π΅ сообщСниС сюда. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ панСль для Π±ΠΎΠ»Π΅Π΅ слоТного форматирования."
44 "Π’Π²ΠΎΠ΄ΠΈΡ‚Π΅ сообщСниС сюда. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ панСль для Π±ΠΎΠ»Π΅Π΅ слоТного форматирования."
45
45
46 #: forms.py:31
46 #: forms.py:31
47 msgid "music images i_dont_like_tags"
47 msgid "music images i_dont_like_tags"
48 msgstr "ΠΌΡƒΠ·Ρ‹ΠΊΠ° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Ρ‚Π΅Π³ΠΈ_Π½Π΅_Π½ΡƒΠΆΠ½Ρ‹"
48 msgstr "ΠΌΡƒΠ·Ρ‹ΠΊΠ° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Ρ‚Π΅Π³ΠΈ_Π½Π΅_Π½ΡƒΠΆΠ½Ρ‹"
49
49
50 #: forms.py:33
50 #: forms.py:33
51 msgid "Title"
51 msgid "Title"
52 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
52 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
53
53
54 #: forms.py:34
54 #: forms.py:34
55 msgid "Text"
55 msgid "Text"
56 msgstr "ВСкст"
56 msgstr "ВСкст"
57
57
58 #: forms.py:35
58 #: forms.py:35
59 msgid "Tag"
59 msgid "Tag"
60 msgstr "ΠœΠ΅Ρ‚ΠΊΠ°"
60 msgstr "ΠœΠ΅Ρ‚ΠΊΠ°"
61
61
62 #: forms.py:36 templates/boards/base.html:40 templates/search/search.html:7
62 #: forms.py:36 templates/boards/base.html:40 templates/search/search.html:7
63 msgid "Search"
63 msgid "Search"
64 msgstr "Поиск"
64 msgstr "Поиск"
65
65
66 #: forms.py:38
66 #: forms.py:139
67 #, python-format
68 msgid "Please wait %s seconds before sending message"
69 msgstr "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ %s сСкунд ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния"
70
71 #: forms.py:138
72 msgid "File"
67 msgid "File"
73 msgstr "Π€Π°ΠΉΠ»"
68 msgstr "Π€Π°ΠΉΠ»"
74
69
75 #: forms.py:141
70 #: forms.py:142
76 msgid "File URL"
71 msgid "File URL"
77 msgstr "URL Ρ„Π°ΠΉΠ»Π°"
72 msgstr "URL Ρ„Π°ΠΉΠ»Π°"
78
73
79 #: forms.py:147
74 #: forms.py:148
80 msgid "e-mail"
75 msgid "e-mail"
81 msgstr ""
76 msgstr ""
82
77
83 #: forms.py:150
78 #: forms.py:151
84 msgid "Additional threads"
79 msgid "Additional threads"
85 msgstr "Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹"
80 msgstr "Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹"
86
81
87 #: forms.py:161
82 #: forms.py:162
88 #, python-format
83 #, python-format
89 msgid "Title must have less than %s characters"
84 msgid "Title must have less than %s characters"
90 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ мСньшС %s символов"
85 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ мСньшС %s символов"
91
86
92 #: forms.py:171
87 #: forms.py:172
93 #, python-format
88 #, python-format
94 msgid "Text must have less than %s characters"
89 msgid "Text must have less than %s characters"
95 msgstr "ВСкст Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅ %s символов"
90 msgstr "ВСкст Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅ %s символов"
96
91
97 #: forms.py:191
92 #: forms.py:192
98 msgid "Invalid URL"
93 msgid "Invalid URL"
99 msgstr "НСвСрный URL"
94 msgstr "НСвСрный URL"
100
95
101 #: forms.py:212
96 #: forms.py:213
102 msgid "Invalid additional thread list"
97 msgid "Invalid additional thread list"
103 msgstr "НСвСрный список Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅ΠΌ"
98 msgstr "НСвСрный список Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅ΠΌ"
104
99
105 #: forms.py:257
100 #: forms.py:258
106 msgid "Either text or file must be entered."
101 msgid "Either text or file must be entered."
107 msgstr "ВСкст ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Ρ‹."
102 msgstr "ВСкст ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Ρ‹."
108
103
109 #: forms.py:316 templates/boards/all_threads.html:148
104 #: forms.py:317 templates/boards/all_threads.html:148
110 #: templates/boards/rss/post.html:10 templates/boards/tags.html:6
105 #: templates/boards/rss/post.html:10 templates/boards/tags.html:6
111 msgid "Tags"
106 msgid "Tags"
112 msgstr "ΠœΠ΅Ρ‚ΠΊΠΈ"
107 msgstr "ΠœΠ΅Ρ‚ΠΊΠΈ"
113
108
114 #: forms.py:323
109 #: forms.py:324
115 msgid "Inappropriate characters in tags."
110 msgid "Inappropriate characters in tags."
116 msgstr "НСдопустимыС символы Π² ΠΌΠ΅Ρ‚ΠΊΠ°Ρ…."
111 msgstr "НСдопустимыС символы Π² ΠΌΠ΅Ρ‚ΠΊΠ°Ρ…."
117
112
118 #: forms.py:337
113 #: forms.py:338
119 msgid "Need at least one section."
114 msgid "Need at least one section."
120 msgstr "НуТСн хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Π΄Π΅Π»."
115 msgstr "НуТСн хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·Π΄Π΅Π»."
121
116
122 #: forms.py:349
117 #: forms.py:350
123 msgid "Theme"
118 msgid "Theme"
124 msgstr "Π’Π΅ΠΌΠ°"
119 msgstr "Π’Π΅ΠΌΠ°"
125
120
126 #: forms.py:350
121 #: forms.py:351
127 msgid "Image view mode"
122 msgid "Image view mode"
128 msgstr "Π Π΅ΠΆΠΈΠΌ просмотра ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
123 msgstr "Π Π΅ΠΆΠΈΠΌ просмотра ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
129
124
130 #: forms.py:351
125 #: forms.py:352
131 msgid "User name"
126 msgid "User name"
132 msgstr "Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ"
127 msgstr "Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ"
133
128
134 #: forms.py:352
129 #: forms.py:353
135 msgid "Time zone"
130 msgid "Time zone"
136 msgstr "Часовой пояс"
131 msgstr "Часовой пояс"
137
132
138 #: forms.py:358
133 #: forms.py:359
139 msgid "Inappropriate characters."
134 msgid "Inappropriate characters."
140 msgstr "НСдопустимыС символы."
135 msgstr "НСдопустимыС символы."
141
136
142 #: templates/boards/404.html:6
137 #: templates/boards/404.html:6
143 msgid "Not found"
138 msgid "Not found"
144 msgstr "НС найдСно"
139 msgstr "НС найдСно"
145
140
146 #: templates/boards/404.html:12
141 #: templates/boards/404.html:12
147 msgid "This page does not exist"
142 msgid "This page does not exist"
148 msgstr "Π­Ρ‚ΠΎΠΉ страницы Π½Π΅ сущСствуСт"
143 msgstr "Π­Ρ‚ΠΎΠΉ страницы Π½Π΅ сущСствуСт"
149
144
150 #: templates/boards/all_threads.html:35
145 #: templates/boards/all_threads.html:35
151 msgid "Related message"
146 msgid "Related message"
152 msgstr "БвязанноС сообщСниС"
147 msgstr "БвязанноС сообщСниС"
153
148
154 #: templates/boards/all_threads.html:69
149 #: templates/boards/all_threads.html:69
155 msgid "Edit tag"
150 msgid "Edit tag"
156 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ"
151 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΡƒ"
157
152
158 #: templates/boards/all_threads.html:75
153 #: templates/boards/all_threads.html:75
159 #, python-format
154 #, python-format
160 msgid ""
155 msgid ""
161 "This tag has %(thread_count)s threads (%(active_thread_count)s active) and "
156 "This tag has %(thread_count)s threads (%(active_thread_count)s active) and "
162 "%(post_count)s posts."
157 "%(post_count)s posts."
163 msgstr ""
158 msgstr ""
164 "Π‘ этой ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ Π΅ΡΡ‚ΡŒ %(thread_count)s Ρ‚Π΅ΠΌ (%(active_thread_count)s Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ…) ΠΈ "
159 "Π‘ этой ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ Π΅ΡΡ‚ΡŒ %(thread_count)s Ρ‚Π΅ΠΌ (%(active_thread_count)s Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ…) ΠΈ "
165 "%(post_count)s сообщСний."
160 "%(post_count)s сообщСний."
166
161
167 #: templates/boards/all_threads.html:77
162 #: templates/boards/all_threads.html:77
168 msgid "Related tags:"
163 msgid "Related tags:"
169 msgstr "ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
164 msgstr "ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
170
165
171 #: templates/boards/all_threads.html:90 templates/boards/feed.html:30
166 #: templates/boards/all_threads.html:90 templates/boards/feed.html:30
172 #: templates/boards/notifications.html:17 templates/search/search.html:26
167 #: templates/boards/notifications.html:17 templates/search/search.html:26
173 msgid "Previous page"
168 msgid "Previous page"
174 msgstr "ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π°Ρ страница"
169 msgstr "ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π°Ρ страница"
175
170
176 #: templates/boards/all_threads.html:104
171 #: templates/boards/all_threads.html:104
177 #, python-format
172 #, python-format
178 msgid "Skipped %(count)s replies. Open thread to see all replies."
173 msgid "Skipped %(count)s replies. Open thread to see all replies."
179 msgstr "ΠŸΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ %(count)s ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚Ρ€Π΅Π΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹."
174 msgstr "ΠŸΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ %(count)s ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ‚Ρ€Π΅Π΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹."
180
175
181 #: templates/boards/all_threads.html:122 templates/boards/feed.html:40
176 #: templates/boards/all_threads.html:122 templates/boards/feed.html:40
182 #: templates/boards/notifications.html:27 templates/search/search.html:37
177 #: templates/boards/notifications.html:27 templates/search/search.html:37
183 msgid "Next page"
178 msgid "Next page"
184 msgstr "Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ страница"
179 msgstr "Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ страница"
185
180
186 #: templates/boards/all_threads.html:127
181 #: templates/boards/all_threads.html:127
187 msgid "No threads exist. Create the first one!"
182 msgid "No threads exist. Create the first one!"
188 msgstr "НСт Ρ‚Π΅ΠΌ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ!"
183 msgstr "НСт Ρ‚Π΅ΠΌ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ!"
189
184
190 #: templates/boards/all_threads.html:133
185 #: templates/boards/all_threads.html:133
191 msgid "Create new thread"
186 msgid "Create new thread"
192 msgstr "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ"
187 msgstr "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ"
193
188
194 #: templates/boards/all_threads.html:138 templates/boards/preview.html:16
189 #: templates/boards/all_threads.html:138 templates/boards/preview.html:16
195 #: templates/boards/thread_normal.html:51
190 #: templates/boards/thread_normal.html:51
196 msgid "Post"
191 msgid "Post"
197 msgstr "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ"
192 msgstr "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ"
198
193
199 #: templates/boards/all_threads.html:139 templates/boards/preview.html:6
194 #: templates/boards/all_threads.html:139 templates/boards/preview.html:6
200 #: templates/boards/staticpages/help.html:21
195 #: templates/boards/staticpages/help.html:21
201 #: templates/boards/thread_normal.html:52
196 #: templates/boards/thread_normal.html:52
202 msgid "Preview"
197 msgid "Preview"
203 msgstr "ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€"
198 msgstr "ΠŸΡ€Π΅Π΄ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€"
204
199
205 #: templates/boards/all_threads.html:144
200 #: templates/boards/all_threads.html:144
206 msgid "Tags must be delimited by spaces. Text or image is required."
201 msgid "Tags must be delimited by spaces. Text or image is required."
207 msgstr ""
202 msgstr ""
208 "ΠœΠ΅Ρ‚ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. ВСкст ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹."
203 "ΠœΠ΅Ρ‚ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. ВСкст ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹."
209
204
210 #: templates/boards/all_threads.html:147 templates/boards/thread_normal.html:58
205 #: templates/boards/all_threads.html:147 templates/boards/thread_normal.html:58
211 msgid "Text syntax"
206 msgid "Text syntax"
212 msgstr "Бинтаксис тСкста"
207 msgstr "Бинтаксис тСкста"
213
208
214 #: templates/boards/all_threads.html:161 templates/boards/feed.html:53
209 #: templates/boards/all_threads.html:161 templates/boards/feed.html:53
215 msgid "Pages:"
210 msgid "Pages:"
216 msgstr "Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹: "
211 msgstr "Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹: "
217
212
218 #: templates/boards/authors.html:6 templates/boards/authors.html.py:12
213 #: templates/boards/authors.html:6 templates/boards/authors.html.py:12
219 msgid "Authors"
214 msgid "Authors"
220 msgstr "Авторы"
215 msgstr "Авторы"
221
216
222 #: templates/boards/authors.html:26
217 #: templates/boards/authors.html:26
223 msgid "Distributed under the"
218 msgid "Distributed under the"
224 msgstr "РаспространяСтся ΠΏΠΎΠ΄"
219 msgstr "РаспространяСтся ΠΏΠΎΠ΄"
225
220
226 #: templates/boards/authors.html:28
221 #: templates/boards/authors.html:28
227 msgid "license"
222 msgid "license"
228 msgstr "Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ"
223 msgstr "Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ"
229
224
230 #: templates/boards/authors.html:30
225 #: templates/boards/authors.html:30
231 msgid "Repository"
226 msgid "Repository"
232 msgstr "Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ"
227 msgstr "Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ"
233
228
234 #: templates/boards/base.html:14 templates/boards/base.html.py:41
229 #: templates/boards/base.html:14 templates/boards/base.html.py:41
235 msgid "Feed"
230 msgid "Feed"
236 msgstr "Π›Π΅Π½Ρ‚Π°"
231 msgstr "Π›Π΅Π½Ρ‚Π°"
237
232
238 #: templates/boards/base.html:31
233 #: templates/boards/base.html:31
239 msgid "All threads"
234 msgid "All threads"
240 msgstr "ВсС Ρ‚Π΅ΠΌΡ‹"
235 msgstr "ВсС Ρ‚Π΅ΠΌΡ‹"
241
236
242 #: templates/boards/base.html:37
237 #: templates/boards/base.html:37
243 msgid "Add tags"
238 msgid "Add tags"
244 msgstr "Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ"
239 msgstr "Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ"
245
240
246 #: templates/boards/base.html:39
241 #: templates/boards/base.html:39
247 msgid "Tag management"
242 msgid "Tag management"
248 msgstr "Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ"
243 msgstr "Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ"
249
244
250 #: templates/boards/base.html:39
245 #: templates/boards/base.html:39
251 msgid "tags"
246 msgid "tags"
252 msgstr "ΠΌΠ΅Ρ‚ΠΊΠΈ"
247 msgstr "ΠΌΠ΅Ρ‚ΠΊΠΈ"
253
248
254 #: templates/boards/base.html:40
249 #: templates/boards/base.html:40
255 msgid "search"
250 msgid "search"
256 msgstr "поиск"
251 msgstr "поиск"
257
252
258 #: templates/boards/base.html:41 templates/boards/feed.html:11
253 #: templates/boards/base.html:41 templates/boards/feed.html:11
259 msgid "feed"
254 msgid "feed"
260 msgstr "Π»Π΅Π½Ρ‚Π°"
255 msgstr "Π»Π΅Π½Ρ‚Π°"
261
256
262 #: templates/boards/base.html:42 templates/boards/random.html:6
257 #: templates/boards/base.html:42 templates/boards/random.html:6
263 msgid "Random images"
258 msgid "Random images"
264 msgstr "Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹Π΅ изобраТСния"
259 msgstr "Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹Π΅ изобраТСния"
265
260
266 #: templates/boards/base.html:42
261 #: templates/boards/base.html:42
267 msgid "random"
262 msgid "random"
268 msgstr "случайныС"
263 msgstr "случайныС"
269
264
270 #: templates/boards/base.html:45 templates/boards/base.html.py:46
265 #: templates/boards/base.html:45 templates/boards/base.html.py:46
271 #: templates/boards/notifications.html:8
266 #: templates/boards/notifications.html:8
272 msgid "Notifications"
267 msgid "Notifications"
273 msgstr "УвСдомлСния"
268 msgstr "УвСдомлСния"
274
269
275 #: templates/boards/base.html:53 templates/boards/settings.html:8
270 #: templates/boards/base.html:53 templates/boards/settings.html:8
276 msgid "Settings"
271 msgid "Settings"
277 msgstr "Настройки"
272 msgstr "Настройки"
278
273
279 #: templates/boards/base.html:79
274 #: templates/boards/base.html:79
280 msgid "Admin"
275 msgid "Admin"
281 msgstr "АдминистрированиС"
276 msgstr "АдминистрированиС"
282
277
283 #: templates/boards/base.html:81
278 #: templates/boards/base.html:81
284 #, python-format
279 #, python-format
285 msgid "Speed: %(ppd)s posts per day"
280 msgid "Speed: %(ppd)s posts per day"
286 msgstr "Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ: %(ppd)s сообщСний Π² дСнь"
281 msgstr "Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ: %(ppd)s сообщСний Π² дСнь"
287
282
288 #: templates/boards/base.html:83
283 #: templates/boards/base.html:83
289 msgid "Up"
284 msgid "Up"
290 msgstr "Π’Π²Π΅Ρ€Ρ…"
285 msgstr "Π’Π²Π΅Ρ€Ρ…"
291
286
292 #: templates/boards/feed.html:45
287 #: templates/boards/feed.html:45
293 msgid "No posts exist. Create the first one!"
288 msgid "No posts exist. Create the first one!"
294 msgstr "НСт сообщСний. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ΅!"
289 msgstr "НСт сообщСний. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ΅!"
295
290
296 #: templates/boards/post.html:32
291 #: templates/boards/post.html:32
297 msgid "Open"
292 msgid "Open"
298 msgstr "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ"
293 msgstr "ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ"
299
294
300 #: templates/boards/post.html:34 templates/boards/post.html.py:45
295 #: templates/boards/post.html:34 templates/boards/post.html.py:45
301 msgid "Reply"
296 msgid "Reply"
302 msgstr "ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ"
297 msgstr "ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ"
303
298
304 #: templates/boards/post.html:40
299 #: templates/boards/post.html:40
305 msgid " in "
300 msgid " in "
306 msgstr " Π² "
301 msgstr " Π² "
307
302
308 #: templates/boards/post.html:50
303 #: templates/boards/post.html:50
309 msgid "Edit"
304 msgid "Edit"
310 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ"
305 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ"
311
306
312 #: templates/boards/post.html:52
307 #: templates/boards/post.html:52
313 msgid "Edit thread"
308 msgid "Edit thread"
314 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΡƒ"
309 msgstr "Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΌΡƒ"
315
310
316 #: templates/boards/post.html:94
311 #: templates/boards/post.html:94
317 msgid "Replies"
312 msgid "Replies"
318 msgstr "ΠžΡ‚Π²Π΅Ρ‚Ρ‹"
313 msgstr "ΠžΡ‚Π²Π΅Ρ‚Ρ‹"
319
314
320 #: templates/boards/post.html:105
315 #: templates/boards/post.html:105
321 #, python-format
316 #, python-format
322 msgid "%(count)s message"
317 msgid "%(count)s message"
323 msgid_plural "%(count)s messages"
318 msgid_plural "%(count)s messages"
324 msgstr[0] "%(count)s сообщСниС"
319 msgstr[0] "%(count)s сообщСниС"
325 msgstr[1] "%(count)s сообщСния"
320 msgstr[1] "%(count)s сообщСния"
326 msgstr[2] "%(count)s сообщСний"
321 msgstr[2] "%(count)s сообщСний"
327
322
323 #, python-format
324 msgid "Please wait %(delay)d second before sending message"
325 msgid_plural "Please wait %(delay)d seconds before sending message"
326 msgstr[0] "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ %(delay)d сСкунду ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния"
327 msgstr[1] "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ %(delay)d сСкунды ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния"
328 msgstr[2] "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅ %(delay)d сСкунд ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ сообщСния"
329
328 #: templates/boards/post.html:106
330 #: templates/boards/post.html:106
329 #, python-format
331 #, python-format
330 msgid "%(count)s image"
332 msgid "%(count)s image"
331 msgid_plural "%(count)s images"
333 msgid_plural "%(count)s images"
332 msgstr[0] "%(count)s ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"
334 msgstr[0] "%(count)s ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"
333 msgstr[1] "%(count)s изобраТСния"
335 msgstr[1] "%(count)s изобраТСния"
334 msgstr[2] "%(count)s ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
336 msgstr[2] "%(count)s ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
335
337
336 #: templates/boards/rss/post.html:5
338 #: templates/boards/rss/post.html:5
337 msgid "Post image"
339 msgid "Post image"
338 msgstr "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сообщСния"
340 msgstr "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сообщСния"
339
341
340 #: templates/boards/settings.html:15
342 #: templates/boards/settings.html:15
341 msgid "You are moderator."
343 msgid "You are moderator."
342 msgstr "Π’Ρ‹ ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€."
344 msgstr "Π’Ρ‹ ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€."
343
345
344 #: templates/boards/settings.html:19
346 #: templates/boards/settings.html:19
345 msgid "Hidden tags:"
347 msgid "Hidden tags:"
346 msgstr "Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
348 msgstr "Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
347
349
348 #: templates/boards/settings.html:25
350 #: templates/boards/settings.html:25
349 msgid "No hidden tags."
351 msgid "No hidden tags."
350 msgstr "НСт скрытых ΠΌΠ΅Ρ‚ΠΎΠΊ."
352 msgstr "НСт скрытых ΠΌΠ΅Ρ‚ΠΎΠΊ."
351
353
352 #: templates/boards/settings.html:34
354 #: templates/boards/settings.html:34
353 msgid "Save"
355 msgid "Save"
354 msgstr "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ"
356 msgstr "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ"
355
357
356 #: templates/boards/staticpages/banned.html:6
358 #: templates/boards/staticpages/banned.html:6
357 msgid "Banned"
359 msgid "Banned"
358 msgstr "Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½"
360 msgstr "Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½"
359
361
360 #: templates/boards/staticpages/banned.html:11
362 #: templates/boards/staticpages/banned.html:11
361 msgid "Your IP address has been banned. Contact the administrator"
363 msgid "Your IP address has been banned. Contact the administrator"
362 msgstr "Π’Π°Ρˆ IP адрСс Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. Π‘Π²ΡΠΆΠΈΡ‚Π΅ΡΡŒ с администратором"
364 msgstr "Π’Π°Ρˆ IP адрСс Π±Ρ‹Π» Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½. Π‘Π²ΡΠΆΠΈΡ‚Π΅ΡΡŒ с администратором"
363
365
364 #: templates/boards/staticpages/help.html:6
366 #: templates/boards/staticpages/help.html:6
365 #: templates/boards/staticpages/help.html:10
367 #: templates/boards/staticpages/help.html:10
366 msgid "Syntax"
368 msgid "Syntax"
367 msgstr "Бинтаксис"
369 msgstr "Бинтаксис"
368
370
369 #: templates/boards/staticpages/help.html:11
371 #: templates/boards/staticpages/help.html:11
370 msgid "Italic text"
372 msgid "Italic text"
371 msgstr "ΠšΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ тСкст"
373 msgstr "ΠšΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ тСкст"
372
374
373 #: templates/boards/staticpages/help.html:12
375 #: templates/boards/staticpages/help.html:12
374 msgid "Bold text"
376 msgid "Bold text"
375 msgstr "ΠŸΠΎΠ»ΡƒΠΆΠΈΡ€Π½Ρ‹ΠΉ тСкст"
377 msgstr "ΠŸΠΎΠ»ΡƒΠΆΠΈΡ€Π½Ρ‹ΠΉ тСкст"
376
378
377 #: templates/boards/staticpages/help.html:13
379 #: templates/boards/staticpages/help.html:13
378 msgid "Spoiler"
380 msgid "Spoiler"
379 msgstr "Π‘ΠΏΠΎΠΉΠ»Π΅Ρ€"
381 msgstr "Π‘ΠΏΠΎΠΉΠ»Π΅Ρ€"
380
382
381 #: templates/boards/staticpages/help.html:14
383 #: templates/boards/staticpages/help.html:14
382 msgid "Link to a post"
384 msgid "Link to a post"
383 msgstr "Бсылка Π½Π° сообщСниС"
385 msgstr "Бсылка Π½Π° сообщСниС"
384
386
385 #: templates/boards/staticpages/help.html:15
387 #: templates/boards/staticpages/help.html:15
386 msgid "Strikethrough text"
388 msgid "Strikethrough text"
387 msgstr "Π—Π°Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚Ρ‹ΠΉ тСкст"
389 msgstr "Π—Π°Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚Ρ‹ΠΉ тСкст"
388
390
389 #: templates/boards/staticpages/help.html:16
391 #: templates/boards/staticpages/help.html:16
390 msgid "Comment"
392 msgid "Comment"
391 msgstr "ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ"
393 msgstr "ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ"
392
394
393 #: templates/boards/staticpages/help.html:17
395 #: templates/boards/staticpages/help.html:17
394 #: templates/boards/staticpages/help.html:18
396 #: templates/boards/staticpages/help.html:18
395 msgid "Quote"
397 msgid "Quote"
396 msgstr "Π¦ΠΈΡ‚Π°Ρ‚Π°"
398 msgstr "Π¦ΠΈΡ‚Π°Ρ‚Π°"
397
399
398 #: templates/boards/staticpages/help.html:21
400 #: templates/boards/staticpages/help.html:21
399 msgid "You can try pasting the text and previewing the result here:"
401 msgid "You can try pasting the text and previewing the result here:"
400 msgstr "Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ тСкст ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ здСсь:"
402 msgstr "Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ тСкст ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ здСсь:"
401
403
402 #: templates/boards/tags.html:17
404 #: templates/boards/tags.html:17
403 msgid "Sections:"
405 msgid "Sections:"
404 msgstr "Π Π°Π·Π΄Π΅Π»Ρ‹:"
406 msgstr "Π Π°Π·Π΄Π΅Π»Ρ‹:"
405
407
406 #: templates/boards/tags.html:30
408 #: templates/boards/tags.html:30
407 msgid "Other tags:"
409 msgid "Other tags:"
408 msgstr "Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
410 msgstr "Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΊΠΈ:"
409
411
410 #: templates/boards/tags.html:43
412 #: templates/boards/tags.html:43
411 msgid "All tags..."
413 msgid "All tags..."
412 msgstr "ВсС ΠΌΠ΅Ρ‚ΠΊΠΈ..."
414 msgstr "ВсС ΠΌΠ΅Ρ‚ΠΊΠΈ..."
413
415
414 #: templates/boards/thread.html:15
416 #: templates/boards/thread.html:15
415 msgid "Normal"
417 msgid "Normal"
416 msgstr "ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ"
418 msgstr "ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ"
417
419
418 #: templates/boards/thread.html:16
420 #: templates/boards/thread.html:16
419 msgid "Gallery"
421 msgid "Gallery"
420 msgstr "ГалСрСя"
422 msgstr "ГалСрСя"
421
423
422 #: templates/boards/thread.html:17
424 #: templates/boards/thread.html:17
423 msgid "Tree"
425 msgid "Tree"
424 msgstr "Π”Π΅Ρ€Π΅Π²ΠΎ"
426 msgstr "Π”Π΅Ρ€Π΅Π²ΠΎ"
425
427
426 #: templates/boards/thread.html:36
428 #: templates/boards/thread.html:36
427 #| msgid "messages"
428 msgid "message"
429 msgid "message"
429 msgid_plural "messages"
430 msgid_plural "messages"
430 msgstr[0] "сообщСниС"
431 msgstr[0] "сообщСниС"
431 msgstr[1] "сообщСния"
432 msgstr[1] "сообщСния"
432 msgstr[2] "сообщСний"
433 msgstr[2] "сообщСний"
433
434
434 #: templates/boards/thread.html:39
435 #: templates/boards/thread.html:39
435 msgid "image"
436 msgid "image"
436 msgid_plural "images"
437 msgid_plural "images"
437 msgstr[0] "ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"
438 msgstr[0] "ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"
438 msgstr[1] "изобраТСния"
439 msgstr[1] "изобраТСния"
439 msgstr[2] "ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
440 msgstr[2] "ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
440
441
441 #: templates/boards/thread.html:41
442 #: templates/boards/thread.html:41
442 msgid "Last update: "
443 msgid "Last update: "
443 msgstr "ПослСднСС обновлСниС: "
444 msgstr "ПослСднСС обновлСниС: "
444
445
445 #: templates/boards/thread_gallery.html:36
446 #: templates/boards/thread_gallery.html:36
446 msgid "No images."
447 msgid "No images."
447 msgstr "НСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ."
448 msgstr "НСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ."
448
449
449 #: templates/boards/thread_normal.html:30
450 #: templates/boards/thread_normal.html:30
450 msgid "posts to bumplimit"
451 msgid "posts to bumplimit"
451 msgstr "сообщСний Π΄ΠΎ Π±Π°ΠΌΠΏΠ»ΠΈΠΌΠΈΡ‚Π°"
452 msgstr "сообщСний Π΄ΠΎ Π±Π°ΠΌΠΏΠ»ΠΈΠΌΠΈΡ‚Π°"
452
453
453 #: templates/boards/thread_normal.html:44
454 #: templates/boards/thread_normal.html:44
454 msgid "Reply to thread"
455 msgid "Reply to thread"
455 msgstr "ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ‚Π΅ΠΌΡƒ"
456 msgstr "ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ‚Π΅ΠΌΡƒ"
456
457
457 #: templates/boards/thread_normal.html:44
458 #: templates/boards/thread_normal.html:44
458 msgid "to message "
459 msgid "to message "
459 msgstr "Π½Π° сообщСниС"
460 msgstr "Π½Π° сообщСниС"
460
461
461 #: templates/boards/thread_normal.html:59
462 #: templates/boards/thread_normal.html:59
462 msgid "Close form"
463 msgid "Close form"
463 msgstr "Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ"
464 msgstr "Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ"
464
465
465 #: templates/search/search.html:17
466 #: templates/search/search.html:17
466 msgid "Ok"
467 msgid "Ok"
467 msgstr "Ок"
468 msgstr "Ок"
468
469
469 #: utils.py:102
470 #: utils.py:102
470 #, python-format
471 #, python-format
471 msgid "File must be less than %s bytes"
472 msgid "File must be less than %s bytes"
472 msgstr "Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ %s Π±Π°ΠΉΡ‚"
473 msgstr "Π€Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ %s Π±Π°ΠΉΡ‚"
@@ -1,562 +1,564 b''
1 * {
1 * {
2 text-decoration: none;
2 text-decoration: none;
3 font-weight: inherit;
3 font-weight: inherit;
4 }
4 }
5
5
6 b, strong {
6 b, strong {
7 font-weight: bold;
7 font-weight: bold;
8 }
8 }
9
9
10 html {
10 html {
11 background: #555;
11 background: #555;
12 color: #ffffff;
12 color: #ffffff;
13 }
13 }
14
14
15 body {
15 body {
16 margin: 0;
16 margin: 0;
17 }
17 }
18
18
19 #admin_panel {
19 #admin_panel {
20 background: #FF0000;
20 background: #FF0000;
21 color: #00FF00
21 color: #00FF00
22 }
22 }
23
23
24 .input_field_error {
24 .input_field_error {
25 color: #FF0000;
25 color: #FF0000;
26 }
26 }
27
27
28 .title {
28 .title {
29 font-weight: bold;
29 font-weight: bold;
30 color: #ffcc00;
30 color: #ffcc00;
31 }
31 }
32
32
33 .link, a {
33 .link, a {
34 color: #afdcec;
34 color: #afdcec;
35 }
35 }
36
36
37 .block {
37 .block {
38 display: inline-block;
38 display: inline-block;
39 vertical-align: top;
39 vertical-align: top;
40 }
40 }
41
41
42 .tag {
42 .tag {
43 color: #FFD37D;
43 color: #FFD37D;
44 }
44 }
45
45
46 .post_id {
46 .post_id {
47 color: #fff380;
47 color: #fff380;
48 }
48 }
49
49
50 .post, .dead_post, .archive_post, #posts-table {
50 .post, .dead_post, .archive_post, #posts-table {
51 background: #333;
51 background: #333;
52 padding: 10px;
52 padding: 10px;
53 clear: left;
53 clear: left;
54 word-wrap: break-word;
54 word-wrap: break-word;
55 border-top: 1px solid #777;
55 border-top: 1px solid #777;
56 border-bottom: 1px solid #777;
56 border-bottom: 1px solid #777;
57 }
57 }
58
58
59 .post + .post {
59 .post + .post {
60 border-top: none;
60 border-top: none;
61 }
61 }
62
62
63 .dead_post + .dead_post {
63 .dead_post + .dead_post {
64 border-top: none;
64 border-top: none;
65 }
65 }
66
66
67 .archive_post + .archive_post {
67 .archive_post + .archive_post {
68 border-top: none;
68 border-top: none;
69 }
69 }
70
70
71 .metadata {
71 .metadata {
72 padding-top: 5px;
72 padding-top: 5px;
73 margin-top: 10px;
73 margin-top: 10px;
74 border-top: solid 1px #666;
74 border-top: solid 1px #666;
75 color: #ddd;
75 color: #ddd;
76 }
76 }
77
77
78 .navigation_panel, .tag_info {
78 .navigation_panel, .tag_info {
79 background: #222;
79 background: #222;
80 margin-bottom: 5px;
80 margin-bottom: 5px;
81 margin-top: 5px;
81 margin-top: 5px;
82 padding: 10px;
82 padding: 10px;
83 border-bottom: solid 1px #888;
83 border-bottom: solid 1px #888;
84 border-top: solid 1px #888;
84 border-top: solid 1px #888;
85 color: #eee;
85 color: #eee;
86 }
86 }
87
87
88 .navigation_panel .link:first-child {
88 .navigation_panel .link:first-child {
89 border-right: 1px solid #fff;
89 border-right: 1px solid #fff;
90 font-weight: bold;
90 font-weight: bold;
91 margin-right: 1ex;
91 margin-right: 1ex;
92 padding-right: 1ex;
92 padding-right: 1ex;
93 }
93 }
94
94
95 .navigation_panel .right-link {
95 .navigation_panel .right-link {
96 border-left: 1px solid #fff;
96 border-left: 1px solid #fff;
97 border-right: none;
97 border-right: none;
98 float: right;
98 float: right;
99 margin-left: 1ex;
99 margin-left: 1ex;
100 margin-right: 0;
100 margin-right: 0;
101 padding-left: 1ex;
101 padding-left: 1ex;
102 padding-right: 0;
102 padding-right: 0;
103 }
103 }
104
104
105 .navigation_panel .link {
105 .navigation_panel .link {
106 font-weight: bold;
106 font-weight: bold;
107 }
107 }
108
108
109 .navigation_panel::after, .post::after {
109 .navigation_panel::after, .post::after {
110 clear: both;
110 clear: both;
111 content: ".";
111 content: ".";
112 display: block;
112 display: block;
113 height: 0;
113 height: 0;
114 line-height: 0;
114 line-height: 0;
115 visibility: hidden;
115 visibility: hidden;
116 }
116 }
117
117
118 .tag_info {
118 .tag_info {
119 text-align: center;
119 text-align: center;
120 }
120 }
121
121
122 .tag_info > .tag-text-data {
122 .tag_info > .tag-text-data {
123 text-align: left;
123 text-align: left;
124 }
124 }
125
125
126 .header {
126 .header {
127 border-bottom: solid 2px #ccc;
127 border-bottom: solid 2px #ccc;
128 margin-bottom: 5px;
128 margin-bottom: 5px;
129 border-top: none;
129 border-top: none;
130 margin-top: 0;
130 margin-top: 0;
131 }
131 }
132
132
133 .footer {
133 .footer {
134 border-top: solid 2px #ccc;
134 border-top: solid 2px #ccc;
135 margin-top: 5px;
135 margin-top: 5px;
136 border-bottom: none;
136 border-bottom: none;
137 margin-bottom: 0;
137 margin-bottom: 0;
138 }
138 }
139
139
140 p, .br {
140 p, .br {
141 margin-top: .5em;
141 margin-top: .5em;
142 margin-bottom: .5em;
142 margin-bottom: .5em;
143 }
143 }
144
144
145 .post-form-w {
145 .post-form-w {
146 background: #333344;
146 background: #333344;
147 border-top: solid 1px #888;
147 border-top: solid 1px #888;
148 border-bottom: solid 1px #888;
148 border-bottom: solid 1px #888;
149 color: #fff;
149 color: #fff;
150 padding: 10px;
150 padding: 10px;
151 margin-bottom: 5px;
151 margin-bottom: 5px;
152 margin-top: 5px;
152 margin-top: 5px;
153 }
153 }
154
154
155 .form-row {
155 .form-row {
156 width: 100%;
156 width: 100%;
157 display: table-row;
157 display: table-row;
158 }
158 }
159
159
160 .form-label {
160 .form-label {
161 padding: .25em 1ex .25em 0;
161 padding: .25em 1ex .25em 0;
162 vertical-align: top;
162 vertical-align: top;
163 display: table-cell;
163 display: table-cell;
164 }
164 }
165
165
166 .form-input {
166 .form-input {
167 padding: .25em 0;
167 padding: .25em 0;
168 width: 100%;
168 width: 100%;
169 display: table-cell;
169 display: table-cell;
170 }
170 }
171
171
172 .form-errors {
172 .form-errors {
173 font-weight: bolder;
173 font-weight: bolder;
174 vertical-align: middle;
174 vertical-align: middle;
175 display: table-cell;
175 display: table-cell;
176 }
176 }
177
177
178 .post-form input:not([name="image"]):not([type="checkbox"]):not([type="submit"]), .post-form textarea, .post-form select {
178 .post-form input:not([name="image"]):not([type="checkbox"]):not([type="submit"]), .post-form textarea, .post-form select {
179 background: #333;
179 background: #333;
180 color: #fff;
180 color: #fff;
181 border: solid 1px;
181 border: solid 1px;
182 padding: 0;
182 padding: 0;
183 font: medium sans-serif;
183 font: medium sans-serif;
184 width: 100%;
184 width: 100%;
185 }
185 }
186
186
187 .post-form textarea {
187 .post-form textarea {
188 resize: vertical;
188 resize: vertical;
189 }
189 }
190
190
191 .form-submit {
191 .form-submit {
192 display: table;
192 display: table;
193 margin-bottom: 1ex;
193 margin-bottom: 1ex;
194 margin-top: 1ex;
194 margin-top: 1ex;
195 }
195 }
196
196
197 .form-title {
197 .form-title {
198 font-weight: bold;
198 font-weight: bold;
199 font-size: 2ex;
199 font-size: 2ex;
200 margin-bottom: 0.5ex;
200 margin-bottom: 0.5ex;
201 }
201 }
202
202
203 input[type="submit"], button {
203 input[type="submit"], button {
204 background: #222;
204 background: #222;
205 border: solid 2px #fff;
205 border: solid 2px #fff;
206 color: #fff;
206 color: #fff;
207 padding: 0.5ex;
207 padding: 0.5ex;
208 margin-right: 0.5ex;
208 margin-right: 0.5ex;
209 }
209 }
210
210
211 input[type="submit"]:hover {
211 input[type="submit"]:hover {
212 background: #060;
212 background: #060;
213 }
213 }
214
214
215 .form-submit > button:hover {
215 .form-submit > button:hover {
216 background: #006;
216 background: #006;
217 }
217 }
218
218
219 blockquote {
219 blockquote {
220 border-left: solid 2px;
220 border-left: solid 2px;
221 padding-left: 5px;
221 padding-left: 5px;
222 color: #B1FB17;
222 color: #B1FB17;
223 margin: 0;
223 margin: 0;
224 }
224 }
225
225
226 .post > .image {
226 .post > .image {
227 float: left;
227 float: left;
228 margin: 0 1ex .5ex 0;
228 margin: 0 1ex .5ex 0;
229 min-width: 1px;
229 min-width: 1px;
230 text-align: center;
230 text-align: center;
231 display: table-row;
231 display: table-row;
232 }
232 }
233
233
234 .post > .metadata {
234 .post > .metadata {
235 clear: left;
235 clear: left;
236 }
236 }
237
237
238 .get {
238 .get {
239 font-weight: bold;
239 font-weight: bold;
240 color: #d55;
240 color: #d55;
241 }
241 }
242
242
243 * {
243 * {
244 text-decoration: none;
244 text-decoration: none;
245 }
245 }
246
246
247 .dead_post > .post-info {
247 .dead_post > .post-info {
248 font-style: italic;
248 font-style: italic;
249 }
249 }
250
250
251 .archive_post > .post-info {
251 .archive_post > .post-info {
252 text-decoration: line-through;
252 text-decoration: line-through;
253 }
253 }
254
254
255 .mark_btn {
255 .mark_btn {
256 border: 1px solid;
256 border: 1px solid;
257 padding: 2px 2ex;
257 padding: 2px 2ex;
258 display: inline-block;
258 display: inline-block;
259 margin: 0 5px 4px 0;
259 margin: 0 5px 4px 0;
260 }
260 }
261
261
262 .mark_btn:hover {
262 .mark_btn:hover {
263 background: #555;
263 background: #555;
264 }
264 }
265
265
266 .quote {
266 .quote {
267 color: #92cf38;
267 color: #92cf38;
268 font-style: italic;
268 font-style: italic;
269 }
269 }
270
270
271 .multiquote {
271 .multiquote {
272 padding: 3px;
272 padding: 3px;
273 display: inline-block;
273 display: inline-block;
274 background: #222;
274 background: #222;
275 border-style: solid;
275 border-style: solid;
276 border-width: 1px 1px 1px 4px;
276 border-width: 1px 1px 1px 4px;
277 font-size: 0.9em;
277 font-size: 0.9em;
278 }
278 }
279
279
280 .spoiler {
280 .spoiler {
281 background: black;
281 background: black;
282 color: black;
282 color: black;
283 padding: 0 1ex 0 1ex;
283 padding: 0 1ex 0 1ex;
284 }
284 }
285
285
286 .spoiler:hover {
286 .spoiler:hover {
287 color: #ddd;
287 color: #ddd;
288 }
288 }
289
289
290 .comment {
290 .comment {
291 color: #eb2;
291 color: #eb2;
292 }
292 }
293
293
294 a:hover {
294 a:hover {
295 text-decoration: underline;
295 text-decoration: underline;
296 }
296 }
297
297
298 .last-replies {
298 .last-replies {
299 margin-left: 3ex;
299 margin-left: 3ex;
300 margin-right: 3ex;
300 margin-right: 3ex;
301 border-left: solid 1px #777;
301 border-left: solid 1px #777;
302 border-right: solid 1px #777;
302 border-right: solid 1px #777;
303 }
303 }
304
304
305 .last-replies > .post:first-child {
305 .last-replies > .post:first-child {
306 border-top: none;
306 border-top: none;
307 }
307 }
308
308
309 .thread {
309 .thread {
310 margin-bottom: 3ex;
310 margin-bottom: 3ex;
311 margin-top: 1ex;
311 margin-top: 1ex;
312 }
312 }
313
313
314 .post:target {
314 .post:target {
315 border: solid 2px white;
315 border: solid 2px white;
316 }
316 }
317
317
318 pre{
318 pre{
319 white-space:pre-wrap
319 white-space:pre-wrap
320 }
320 }
321
321
322 li {
322 li {
323 list-style-position: inside;
323 list-style-position: inside;
324 }
324 }
325
325
326 .fancybox-skin {
326 .fancybox-skin {
327 position: relative;
327 position: relative;
328 background-color: #fff;
328 background-color: #fff;
329 color: #ddd;
329 color: #ddd;
330 text-shadow: none;
330 text-shadow: none;
331 }
331 }
332
332
333 .fancybox-image {
333 .fancybox-image {
334 border: 1px solid black;
334 border: 1px solid black;
335 }
335 }
336
336
337 .image-mode-tab {
337 .image-mode-tab {
338 background: #444;
338 background: #444;
339 color: #eee;
339 color: #eee;
340 margin-top: 5px;
340 margin-top: 5px;
341 padding: 5px;
341 padding: 5px;
342 border-top: 1px solid #888;
342 border-top: 1px solid #888;
343 border-bottom: 1px solid #888;
343 border-bottom: 1px solid #888;
344 }
344 }
345
345
346 .image-mode-tab > label {
346 .image-mode-tab > label {
347 margin: 0 1ex;
347 margin: 0 1ex;
348 }
348 }
349
349
350 .image-mode-tab > label > input {
350 .image-mode-tab > label > input {
351 margin-right: .5ex;
351 margin-right: .5ex;
352 }
352 }
353
353
354 #posts-table {
354 #posts-table {
355 margin-top: 5px;
355 margin-top: 5px;
356 margin-bottom: 5px;
356 margin-bottom: 5px;
357 }
357 }
358
358
359 .tag_info > h2 {
359 .tag_info > h2 {
360 margin: 0;
360 margin: 0;
361 }
361 }
362
362
363 .post-info {
363 .post-info {
364 color: #ddd;
364 color: #ddd;
365 margin-bottom: 1ex;
365 margin-bottom: 1ex;
366 }
366 }
367
367
368 .moderator_info {
368 .moderator_info {
369 color: #e99d41;
369 color: #e99d41;
370 opacity: 0.4;
370 opacity: 0.4;
371 }
371 }
372
372
373 .moderator_info:hover {
373 .moderator_info:hover {
374 opacity: 1;
374 opacity: 1;
375 }
375 }
376
376
377 .refmap {
377 .refmap {
378 font-size: 0.9em;
378 font-size: 0.9em;
379 color: #ccc;
379 color: #ccc;
380 margin-top: 1em;
380 margin-top: 1em;
381 }
381 }
382
382
383 .fav {
383 .fav {
384 color: yellow;
384 color: yellow;
385 }
385 }
386
386
387 .not_fav {
387 .not_fav {
388 color: #ccc;
388 color: #ccc;
389 }
389 }
390
390
391 .role {
391 .role {
392 text-decoration: underline;
392 text-decoration: underline;
393 }
393 }
394
394
395 .form-email {
395 .form-email {
396 display: none;
396 display: none;
397 }
397 }
398
398
399 .bar-value {
399 .bar-value {
400 background: rgba(50, 55, 164, 0.45);
400 background: rgba(50, 55, 164, 0.45);
401 font-size: 0.9em;
401 font-size: 0.9em;
402 height: 1.5em;
402 height: 1.5em;
403 }
403 }
404
404
405 .bar-bg {
405 .bar-bg {
406 position: relative;
406 position: relative;
407 border-top: solid 1px #888;
407 border-top: solid 1px #888;
408 border-bottom: solid 1px #888;
408 border-bottom: solid 1px #888;
409 margin-top: 5px;
409 margin-top: 5px;
410 overflow: hidden;
410 overflow: hidden;
411 }
411 }
412
412
413 .bar-text {
413 .bar-text {
414 padding: 2px;
414 padding: 2px;
415 position: absolute;
415 position: absolute;
416 left: 0;
416 left: 0;
417 top: 0;
417 top: 0;
418 }
418 }
419
419
420 .page_link {
420 .page_link {
421 background: #444;
421 background: #444;
422 border-top: solid 1px #888;
422 border-top: solid 1px #888;
423 border-bottom: solid 1px #888;
423 border-bottom: solid 1px #888;
424 padding: 5px;
424 padding: 5px;
425 color: #eee;
425 color: #eee;
426 font-size: 2ex;
426 font-size: 2ex;
427 margin-top: .5ex;
428 margin-bottom: .5ex;
427 }
429 }
428
430
429 .skipped_replies {
431 .skipped_replies {
430 padding: 5px;
432 padding: 5px;
431 margin-left: 3ex;
433 margin-left: 3ex;
432 margin-right: 3ex;
434 margin-right: 3ex;
433 border-left: solid 1px #888;
435 border-left: solid 1px #888;
434 border-right: solid 1px #888;
436 border-right: solid 1px #888;
435 border-bottom: solid 1px #888;
437 border-bottom: solid 1px #888;
436 background: #000;
438 background: #000;
437 }
439 }
438
440
439 .current_page {
441 .current_page {
440 padding: 2px;
442 padding: 2px;
441 background-color: #afdcec;
443 background-color: #afdcec;
442 color: #000;
444 color: #000;
443 }
445 }
444
446
445 .current_mode {
447 .current_mode {
446 font-weight: bold;
448 font-weight: bold;
447 }
449 }
448
450
449 .gallery_image {
451 .gallery_image {
450 border: solid 1px;
452 border: solid 1px;
451 margin: 0.5ex;
453 margin: 0.5ex;
452 text-align: center;
454 text-align: center;
453 }
455 }
454
456
455 code {
457 code {
456 border: dashed 1px #ccc;
458 border: dashed 1px #ccc;
457 background: #111;
459 background: #111;
458 padding: 2px;
460 padding: 2px;
459 font-size: 1.2em;
461 font-size: 1.2em;
460 display: inline-block;
462 display: inline-block;
461 }
463 }
462
464
463 pre {
465 pre {
464 overflow: auto;
466 overflow: auto;
465 }
467 }
466
468
467 .img-full {
469 .img-full {
468 background: #222;
470 background: #222;
469 border: solid 1px white;
471 border: solid 1px white;
470 }
472 }
471
473
472 .tag_item {
474 .tag_item {
473 display: inline-block;
475 display: inline-block;
474 }
476 }
475
477
476 #id_models li {
478 #id_models li {
477 list-style: none;
479 list-style: none;
478 }
480 }
479
481
480 #id_q {
482 #id_q {
481 margin-left: 1ex;
483 margin-left: 1ex;
482 }
484 }
483
485
484 ul {
486 ul {
485 padding-left: 0px;
487 padding-left: 0px;
486 }
488 }
487
489
488 .quote-header {
490 .quote-header {
489 border-bottom: 2px solid #ddd;
491 border-bottom: 2px solid #ddd;
490 margin-bottom: 1ex;
492 margin-bottom: 1ex;
491 padding-bottom: .5ex;
493 padding-bottom: .5ex;
492 color: #ddd;
494 color: #ddd;
493 font-size: 1.2em;
495 font-size: 1.2em;
494 }
496 }
495
497
496 /* Reflink preview */
498 /* Reflink preview */
497 .post_preview {
499 .post_preview {
498 border-left: 1px solid #777;
500 border-left: 1px solid #777;
499 border-right: 1px solid #777;
501 border-right: 1px solid #777;
500 max-width: 600px;
502 max-width: 600px;
501 }
503 }
502
504
503 /* Code highlighter */
505 /* Code highlighter */
504 .hljs {
506 .hljs {
505 color: #fff;
507 color: #fff;
506 background: #000;
508 background: #000;
507 display: inline-block;
509 display: inline-block;
508 }
510 }
509
511
510 .hljs, .hljs-subst, .hljs-tag .hljs-title, .lisp .hljs-title, .clojure .hljs-built_in, .nginx .hljs-title {
512 .hljs, .hljs-subst, .hljs-tag .hljs-title, .lisp .hljs-title, .clojure .hljs-built_in, .nginx .hljs-title {
511 color: #fff;
513 color: #fff;
512 }
514 }
513
515
514 #up {
516 #up {
515 position: fixed;
517 position: fixed;
516 bottom: 5px;
518 bottom: 5px;
517 right: 5px;
519 right: 5px;
518 border: 1px solid #777;
520 border: 1px solid #777;
519 background: #000;
521 background: #000;
520 padding: 4px;
522 padding: 4px;
521 opacity: 0.3;
523 opacity: 0.3;
522 }
524 }
523
525
524 #up:hover {
526 #up:hover {
525 opacity: 1;
527 opacity: 1;
526 }
528 }
527
529
528 .user-cast {
530 .user-cast {
529 border: solid #ffffff 1px;
531 border: solid #ffffff 1px;
530 padding: .2ex;
532 padding: .2ex;
531 background: #152154;
533 background: #152154;
532 color: #fff;
534 color: #fff;
533 }
535 }
534
536
535 .highlight {
537 .highlight {
536 background: #222;
538 background: #222;
537 }
539 }
538
540
539 .post-button-form > button:hover {
541 .post-button-form > button:hover {
540 text-decoration: underline;
542 text-decoration: underline;
541 }
543 }
542
544
543 .tree_reply > .post {
545 .tree_reply > .post {
544 margin-top: 1ex;
546 margin-top: 1ex;
545 border-left: solid 1px #777;
547 border-left: solid 1px #777;
546 padding-right: 0;
548 padding-right: 0;
547 }
549 }
548
550
549 #preview-text {
551 #preview-text {
550 border: solid 1px white;
552 border: solid 1px white;
551 margin: 1ex 0 1ex 0;
553 margin: 1ex 0 1ex 0;
552 padding: 1ex;
554 padding: 1ex;
553 }
555 }
554
556
555 .image-metadata {
557 .image-metadata {
556 font-style: italic;
558 font-style: italic;
557 font-size: 0.9em;
559 font-size: 0.9em;
558 }
560 }
559
561
560 .tripcode {
562 .tripcode {
561 color: white;
563 color: white;
562 }
564 }
General Comments 0
You need to be logged in to leave comments. Login now