##// END OF EJS Templates
Show max file size in the posting templates
neko259 -
r1396:52abbcde default
parent child Browse files
Show More
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -1,501 +1,505 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-10-09 23:21+0300\n"
10 "POT-Creation-Date: 2015-10-09 23:21+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:139
66 #: forms.py:139
67 msgid "File"
67 msgid "File"
68 msgstr "Файл"
68 msgstr "Файл"
69
69
70 #: forms.py:142
70 #: forms.py:142
71 msgid "File URL"
71 msgid "File URL"
72 msgstr "URL файла"
72 msgstr "URL файла"
73
73
74 #: forms.py:148
74 #: forms.py:148
75 msgid "e-mail"
75 msgid "e-mail"
76 msgstr ""
76 msgstr ""
77
77
78 #: forms.py:151
78 #: forms.py:151
79 msgid "Additional threads"
79 msgid "Additional threads"
80 msgstr "Дополнительные темы"
80 msgstr "Дополнительные темы"
81
81
82 #: forms.py:162
82 #: forms.py:162
83 #, python-format
83 #, python-format
84 msgid "Title must have less than %s characters"
84 msgid "Title must have less than %s characters"
85 msgstr "Заголовок должен иметь меньше %s символов"
85 msgstr "Заголовок должен иметь меньше %s символов"
86
86
87 #: forms.py:172
87 #: forms.py:172
88 #, python-format
88 #, python-format
89 msgid "Text must have less than %s characters"
89 msgid "Text must have less than %s characters"
90 msgstr "Текст должен быть короче %s символов"
90 msgstr "Текст должен быть короче %s символов"
91
91
92 #: forms.py:192
92 #: forms.py:192
93 msgid "Invalid URL"
93 msgid "Invalid URL"
94 msgstr "Неверный URL"
94 msgstr "Неверный URL"
95
95
96 #: forms.py:213
96 #: forms.py:213
97 msgid "Invalid additional thread list"
97 msgid "Invalid additional thread list"
98 msgstr "Неверный список дополнительных тем"
98 msgstr "Неверный список дополнительных тем"
99
99
100 #: forms.py:258
100 #: forms.py:258
101 msgid "Either text or file must be entered."
101 msgid "Either text or file must be entered."
102 msgstr "Текст или файл должны быть введены."
102 msgstr "Текст или файл должны быть введены."
103
103
104 #: forms.py:317 templates/boards/all_threads.html:153
104 #: forms.py:317 templates/boards/all_threads.html:153
105 #: templates/boards/rss/post.html:10 templates/boards/tags.html:6
105 #: templates/boards/rss/post.html:10 templates/boards/tags.html:6
106 msgid "Tags"
106 msgid "Tags"
107 msgstr "Метки"
107 msgstr "Метки"
108
108
109 #: forms.py:324
109 #: forms.py:324
110 msgid "Inappropriate characters in tags."
110 msgid "Inappropriate characters in tags."
111 msgstr "Недопустимые символы в метках."
111 msgstr "Недопустимые символы в метках."
112
112
113 #: forms.py:344
113 #: forms.py:344
114 msgid "Need at least one section."
114 msgid "Need at least one section."
115 msgstr "Нужен хотя бы один раздел."
115 msgstr "Нужен хотя бы один раздел."
116
116
117 #: forms.py:356
117 #: forms.py:356
118 msgid "Theme"
118 msgid "Theme"
119 msgstr "Тема"
119 msgstr "Тема"
120
120
121 #: forms.py:357
121 #: forms.py:357
122 msgid "Image view mode"
122 msgid "Image view mode"
123 msgstr "Режим просмотра изображений"
123 msgstr "Режим просмотра изображений"
124
124
125 #: forms.py:358
125 #: forms.py:358
126 msgid "User name"
126 msgid "User name"
127 msgstr "Имя пользователя"
127 msgstr "Имя пользователя"
128
128
129 #: forms.py:359
129 #: forms.py:359
130 msgid "Time zone"
130 msgid "Time zone"
131 msgstr "Часовой пояс"
131 msgstr "Часовой пояс"
132
132
133 #: forms.py:365
133 #: forms.py:365
134 msgid "Inappropriate characters."
134 msgid "Inappropriate characters."
135 msgstr "Недопустимые символы."
135 msgstr "Недопустимые символы."
136
136
137 #: templates/boards/404.html:6
137 #: templates/boards/404.html:6
138 msgid "Not found"
138 msgid "Not found"
139 msgstr "Не найдено"
139 msgstr "Не найдено"
140
140
141 #: templates/boards/404.html:12
141 #: templates/boards/404.html:12
142 msgid "This page does not exist"
142 msgid "This page does not exist"
143 msgstr "Этой страницы не существует"
143 msgstr "Этой страницы не существует"
144
144
145 #: templates/boards/all_threads.html:35
145 #: templates/boards/all_threads.html:35
146 msgid "Related message"
146 msgid "Related message"
147 msgstr "Связанное сообщение"
147 msgstr "Связанное сообщение"
148
148
149 #: templates/boards/all_threads.html:69
149 #: templates/boards/all_threads.html:69
150 msgid "Edit tag"
150 msgid "Edit tag"
151 msgstr "Изменить метку"
151 msgstr "Изменить метку"
152
152
153 #: templates/boards/all_threads.html:76
153 #: templates/boards/all_threads.html:76
154 #, python-format
154 #, python-format
155 msgid "%(count)s active thread"
155 msgid "%(count)s active thread"
156 msgid_plural "%(count)s active threads"
156 msgid_plural "%(count)s active threads"
157 msgstr[0] "%(count)s активная тема"
157 msgstr[0] "%(count)s активная тема"
158 msgstr[1] "%(count)s активные темы"
158 msgstr[1] "%(count)s активные темы"
159 msgstr[2] "%(count)s активных тем"
159 msgstr[2] "%(count)s активных тем"
160
160
161 #: templates/boards/all_threads.html:76
161 #: templates/boards/all_threads.html:76
162 #, python-format
162 #, python-format
163 msgid "%(count)s thread in bumplimit"
163 msgid "%(count)s thread in bumplimit"
164 msgid_plural "%(count)s threads in bumplimit"
164 msgid_plural "%(count)s threads in bumplimit"
165 msgstr[0] "%(count)s тема в бамплимите"
165 msgstr[0] "%(count)s тема в бамплимите"
166 msgstr[1] "%(count)s темы в бамплимите"
166 msgstr[1] "%(count)s темы в бамплимите"
167 msgstr[2] "%(count)s тем в бамплимите"
167 msgstr[2] "%(count)s тем в бамплимите"
168
168
169 #: templates/boards/all_threads.html:77
169 #: templates/boards/all_threads.html:77
170 #, python-format
170 #, python-format
171 msgid "%(count)s archived thread"
171 msgid "%(count)s archived thread"
172 msgid_plural "%(count)s archived thread"
172 msgid_plural "%(count)s archived thread"
173 msgstr[0] "%(count)s архивная тема"
173 msgstr[0] "%(count)s архивная тема"
174 msgstr[1] "%(count)s архивные темы"
174 msgstr[1] "%(count)s архивные темы"
175 msgstr[2] "%(count)s архивных тем"
175 msgstr[2] "%(count)s архивных тем"
176
176
177 #: templates/boards/all_threads.html:78 templates/boards/post.html:102
177 #: templates/boards/all_threads.html:78 templates/boards/post.html:102
178 #, python-format
178 #, python-format
179 #| msgid "%(count)s message"
179 #| msgid "%(count)s message"
180 #| msgid_plural "%(count)s messages"
180 #| msgid_plural "%(count)s messages"
181 msgid "%(count)s message"
181 msgid "%(count)s message"
182 msgid_plural "%(count)s messages"
182 msgid_plural "%(count)s messages"
183 msgstr[0] "%(count)s сообщение"
183 msgstr[0] "%(count)s сообщение"
184 msgstr[1] "%(count)s сообщения"
184 msgstr[1] "%(count)s сообщения"
185 msgstr[2] "%(count)s сообщений"
185 msgstr[2] "%(count)s сообщений"
186
186
187 #: templates/boards/all_threads.html:95 templates/boards/feed.html:30
187 #: templates/boards/all_threads.html:95 templates/boards/feed.html:30
188 #: templates/boards/notifications.html:17 templates/search/search.html:26
188 #: templates/boards/notifications.html:17 templates/search/search.html:26
189 msgid "Previous page"
189 msgid "Previous page"
190 msgstr "Предыдущая страница"
190 msgstr "Предыдущая страница"
191
191
192 #: templates/boards/all_threads.html:109
192 #: templates/boards/all_threads.html:109
193 #, python-format
193 #, python-format
194 msgid "Skipped %(count)s reply. Open thread to see all replies."
194 msgid "Skipped %(count)s reply. Open thread to see all replies."
195 msgid_plural "Skipped %(count)s replies. Open thread to see all replies."
195 msgid_plural "Skipped %(count)s replies. Open thread to see all replies."
196 msgstr[0] "Пропущен %(count)s ответ. Откройте тред, чтобы увидеть все ответы."
196 msgstr[0] "Пропущен %(count)s ответ. Откройте тред, чтобы увидеть все ответы."
197 msgstr[1] ""
197 msgstr[1] ""
198 "Пропущено %(count)s ответа. Откройте тред, чтобы увидеть все ответы."
198 "Пропущено %(count)s ответа. Откройте тред, чтобы увидеть все ответы."
199 msgstr[2] ""
199 msgstr[2] ""
200 "Пропущено %(count)s ответов. Откройте тред, чтобы увидеть все ответы."
200 "Пропущено %(count)s ответов. Откройте тред, чтобы увидеть все ответы."
201
201
202 #: templates/boards/all_threads.html:127 templates/boards/feed.html:40
202 #: templates/boards/all_threads.html:127 templates/boards/feed.html:40
203 #: templates/boards/notifications.html:27 templates/search/search.html:37
203 #: templates/boards/notifications.html:27 templates/search/search.html:37
204 msgid "Next page"
204 msgid "Next page"
205 msgstr "Следующая страница"
205 msgstr "Следующая страница"
206
206
207 #: templates/boards/all_threads.html:132
207 #: templates/boards/all_threads.html:132
208 msgid "No threads exist. Create the first one!"
208 msgid "No threads exist. Create the first one!"
209 msgstr "Нет тем. Создайте первую!"
209 msgstr "Нет тем. Создайте первую!"
210
210
211 #: templates/boards/all_threads.html:138
211 #: templates/boards/all_threads.html:138
212 msgid "Create new thread"
212 msgid "Create new thread"
213 msgstr "Создать новую тему"
213 msgstr "Создать новую тему"
214
214
215 #: templates/boards/all_threads.html:143 templates/boards/preview.html:16
215 #: templates/boards/all_threads.html:143 templates/boards/preview.html:16
216 #: templates/boards/thread_normal.html:51
216 #: templates/boards/thread_normal.html:51
217 msgid "Post"
217 msgid "Post"
218 msgstr "Отправить"
218 msgstr "Отправить"
219
219
220 #: templates/boards/all_threads.html:144 templates/boards/preview.html:6
220 #: templates/boards/all_threads.html:144 templates/boards/preview.html:6
221 #: templates/boards/staticpages/help.html:21
221 #: templates/boards/staticpages/help.html:21
222 #: templates/boards/thread_normal.html:52
222 #: templates/boards/thread_normal.html:52
223 msgid "Preview"
223 msgid "Preview"
224 msgstr "Предпросмотр"
224 msgstr "Предпросмотр"
225
225
226 #: templates/boards/all_threads.html:149
226 #: templates/boards/all_threads.html:149
227 msgid "Tags must be delimited by spaces. Text or image is required."
227 msgid "Tags must be delimited by spaces. Text or image is required."
228 msgstr ""
228 msgstr ""
229 "Метки должны быть разделены пробелами. Текст или изображение обязательны."
229 "Метки должны быть разделены пробелами. Текст или изображение обязательны."
230
230
231 #: templates/boards/all_threads.html:152 templates/boards/thread_normal.html:58
231 #: templates/boards/all_threads.html:152 templates/boards/thread_normal.html:58
232 msgid "Text syntax"
232 msgid "Text syntax"
233 msgstr "Синтаксис текста"
233 msgstr "Синтаксис текста"
234
234
235 #: templates/boards/all_threads.html:166 templates/boards/feed.html:53
235 #: templates/boards/all_threads.html:166 templates/boards/feed.html:53
236 msgid "Pages:"
236 msgid "Pages:"
237 msgstr "Страницы: "
237 msgstr "Страницы: "
238
238
239 #: templates/boards/authors.html:6 templates/boards/authors.html.py:12
239 #: templates/boards/authors.html:6 templates/boards/authors.html.py:12
240 msgid "Authors"
240 msgid "Authors"
241 msgstr "Авторы"
241 msgstr "Авторы"
242
242
243 #: templates/boards/authors.html:26
243 #: templates/boards/authors.html:26
244 msgid "Distributed under the"
244 msgid "Distributed under the"
245 msgstr "Распространяется под"
245 msgstr "Распространяется под"
246
246
247 #: templates/boards/authors.html:28
247 #: templates/boards/authors.html:28
248 msgid "license"
248 msgid "license"
249 msgstr "лицензией"
249 msgstr "лицензией"
250
250
251 #: templates/boards/authors.html:30
251 #: templates/boards/authors.html:30
252 msgid "Repository"
252 msgid "Repository"
253 msgstr "Репозиторий"
253 msgstr "Репозиторий"
254
254
255 #: templates/boards/base.html:14 templates/boards/base.html.py:41
255 #: templates/boards/base.html:14 templates/boards/base.html.py:41
256 msgid "Feed"
256 msgid "Feed"
257 msgstr "Лента"
257 msgstr "Лента"
258
258
259 #: templates/boards/base.html:31
259 #: templates/boards/base.html:31
260 msgid "All threads"
260 msgid "All threads"
261 msgstr "Все темы"
261 msgstr "Все темы"
262
262
263 #: templates/boards/base.html:37
263 #: templates/boards/base.html:37
264 msgid "Add tags"
264 msgid "Add tags"
265 msgstr "Добавить метки"
265 msgstr "Добавить метки"
266
266
267 #: templates/boards/base.html:39
267 #: templates/boards/base.html:39
268 msgid "Tag management"
268 msgid "Tag management"
269 msgstr "Управление метками"
269 msgstr "Управление метками"
270
270
271 #: templates/boards/base.html:39
271 #: templates/boards/base.html:39
272 msgid "tags"
272 msgid "tags"
273 msgstr "метки"
273 msgstr "метки"
274
274
275 #: templates/boards/base.html:40
275 #: templates/boards/base.html:40
276 msgid "search"
276 msgid "search"
277 msgstr "поиск"
277 msgstr "поиск"
278
278
279 #: templates/boards/base.html:41 templates/boards/feed.html:11
279 #: templates/boards/base.html:41 templates/boards/feed.html:11
280 msgid "feed"
280 msgid "feed"
281 msgstr "лента"
281 msgstr "лента"
282
282
283 #: templates/boards/base.html:42 templates/boards/random.html:6
283 #: templates/boards/base.html:42 templates/boards/random.html:6
284 msgid "Random images"
284 msgid "Random images"
285 msgstr "Случайные изображения"
285 msgstr "Случайные изображения"
286
286
287 #: templates/boards/base.html:42
287 #: templates/boards/base.html:42
288 msgid "random"
288 msgid "random"
289 msgstr "случайные"
289 msgstr "случайные"
290
290
291 #: templates/boards/base.html:44
291 #: templates/boards/base.html:44
292 msgid "favorites"
292 msgid "favorites"
293 msgstr "избранное"
293 msgstr "избранное"
294
294
295 #: templates/boards/base.html:48 templates/boards/base.html.py:49
295 #: templates/boards/base.html:48 templates/boards/base.html.py:49
296 #: templates/boards/notifications.html:8
296 #: templates/boards/notifications.html:8
297 msgid "Notifications"
297 msgid "Notifications"
298 msgstr "Уведомления"
298 msgstr "Уведомления"
299
299
300 #: templates/boards/base.html:56 templates/boards/settings.html:8
300 #: templates/boards/base.html:56 templates/boards/settings.html:8
301 msgid "Settings"
301 msgid "Settings"
302 msgstr "Настройки"
302 msgstr "Настройки"
303
303
304 #: templates/boards/base.html:59
304 #: templates/boards/base.html:59
305 msgid "Loading..."
305 msgid "Loading..."
306 msgstr "Загрузка..."
306 msgstr "Загрузка..."
307
307
308 #: templates/boards/base.html:71
308 #: templates/boards/base.html:71
309 msgid "Admin"
309 msgid "Admin"
310 msgstr "Администрирование"
310 msgstr "Администрирование"
311
311
312 #: templates/boards/base.html:73
312 #: templates/boards/base.html:73
313 #, python-format
313 #, python-format
314 msgid "Speed: %(ppd)s posts per day"
314 msgid "Speed: %(ppd)s posts per day"
315 msgstr "Скорость: %(ppd)s сообщений в день"
315 msgstr "Скорость: %(ppd)s сообщений в день"
316
316
317 #: templates/boards/base.html:75
317 #: templates/boards/base.html:75
318 msgid "Up"
318 msgid "Up"
319 msgstr "Вверх"
319 msgstr "Вверх"
320
320
321 #: templates/boards/feed.html:45
321 #: templates/boards/feed.html:45
322 msgid "No posts exist. Create the first one!"
322 msgid "No posts exist. Create the first one!"
323 msgstr "Нет сообщений. Создайте первое!"
323 msgstr "Нет сообщений. Создайте первое!"
324
324
325 #: templates/boards/post.html:33
325 #: templates/boards/post.html:33
326 msgid "Open"
326 msgid "Open"
327 msgstr "Открыть"
327 msgstr "Открыть"
328
328
329 #: templates/boards/post.html:35 templates/boards/post.html.py:46
329 #: templates/boards/post.html:35 templates/boards/post.html.py:46
330 msgid "Reply"
330 msgid "Reply"
331 msgstr "Ответить"
331 msgstr "Ответить"
332
332
333 #: templates/boards/post.html:41
333 #: templates/boards/post.html:41
334 msgid " in "
334 msgid " in "
335 msgstr " в "
335 msgstr " в "
336
336
337 #: templates/boards/post.html:51
337 #: templates/boards/post.html:51
338 msgid "Edit"
338 msgid "Edit"
339 msgstr "Изменить"
339 msgstr "Изменить"
340
340
341 #: templates/boards/post.html:53
341 #: templates/boards/post.html:53
342 msgid "Edit thread"
342 msgid "Edit thread"
343 msgstr "Изменить тему"
343 msgstr "Изменить тему"
344
344
345 #: templates/boards/post.html:91
345 #: templates/boards/post.html:91
346 msgid "Replies"
346 msgid "Replies"
347 msgstr "Ответы"
347 msgstr "Ответы"
348
348
349 #: templates/boards/post.html:103
349 #: templates/boards/post.html:103
350 #, python-format
350 #, python-format
351 msgid "%(count)s image"
351 msgid "%(count)s image"
352 msgid_plural "%(count)s images"
352 msgid_plural "%(count)s images"
353 msgstr[0] "%(count)s изображение"
353 msgstr[0] "%(count)s изображение"
354 msgstr[1] "%(count)s изображения"
354 msgstr[1] "%(count)s изображения"
355 msgstr[2] "%(count)s изображений"
355 msgstr[2] "%(count)s изображений"
356
356
357 #: templates/boards/rss/post.html:5
357 #: templates/boards/rss/post.html:5
358 msgid "Post image"
358 msgid "Post image"
359 msgstr "Изображение сообщения"
359 msgstr "Изображение сообщения"
360
360
361 #: templates/boards/settings.html:15
361 #: templates/boards/settings.html:15
362 msgid "You are moderator."
362 msgid "You are moderator."
363 msgstr "Вы модератор."
363 msgstr "Вы модератор."
364
364
365 #: templates/boards/settings.html:19
365 #: templates/boards/settings.html:19
366 msgid "Hidden tags:"
366 msgid "Hidden tags:"
367 msgstr "Скрытые метки:"
367 msgstr "Скрытые метки:"
368
368
369 #: templates/boards/settings.html:25
369 #: templates/boards/settings.html:25
370 msgid "No hidden tags."
370 msgid "No hidden tags."
371 msgstr "Нет скрытых меток."
371 msgstr "Нет скрытых меток."
372
372
373 #: templates/boards/settings.html:34
373 #: templates/boards/settings.html:34
374 msgid "Save"
374 msgid "Save"
375 msgstr "Сохранить"
375 msgstr "Сохранить"
376
376
377 #: templates/boards/staticpages/banned.html:6
377 #: templates/boards/staticpages/banned.html:6
378 msgid "Banned"
378 msgid "Banned"
379 msgstr "Заблокирован"
379 msgstr "Заблокирован"
380
380
381 #: templates/boards/staticpages/banned.html:11
381 #: templates/boards/staticpages/banned.html:11
382 msgid "Your IP address has been banned. Contact the administrator"
382 msgid "Your IP address has been banned. Contact the administrator"
383 msgstr "Ваш IP адрес был заблокирован. Свяжитесь с администратором"
383 msgstr "Ваш IP адрес был заблокирован. Свяжитесь с администратором"
384
384
385 #: templates/boards/staticpages/help.html:6
385 #: templates/boards/staticpages/help.html:6
386 #: templates/boards/staticpages/help.html:10
386 #: templates/boards/staticpages/help.html:10
387 msgid "Syntax"
387 msgid "Syntax"
388 msgstr "Синтаксис"
388 msgstr "Синтаксис"
389
389
390 #: templates/boards/staticpages/help.html:11
390 #: templates/boards/staticpages/help.html:11
391 msgid "Italic text"
391 msgid "Italic text"
392 msgstr "Курсивный текст"
392 msgstr "Курсивный текст"
393
393
394 #: templates/boards/staticpages/help.html:12
394 #: templates/boards/staticpages/help.html:12
395 msgid "Bold text"
395 msgid "Bold text"
396 msgstr "Полужирный текст"
396 msgstr "Полужирный текст"
397
397
398 #: templates/boards/staticpages/help.html:13
398 #: templates/boards/staticpages/help.html:13
399 msgid "Spoiler"
399 msgid "Spoiler"
400 msgstr "Спойлер"
400 msgstr "Спойлер"
401
401
402 #: templates/boards/staticpages/help.html:14
402 #: templates/boards/staticpages/help.html:14
403 msgid "Link to a post"
403 msgid "Link to a post"
404 msgstr "Ссылка на сообщение"
404 msgstr "Ссылка на сообщение"
405
405
406 #: templates/boards/staticpages/help.html:15
406 #: templates/boards/staticpages/help.html:15
407 msgid "Strikethrough text"
407 msgid "Strikethrough text"
408 msgstr "Зачеркнутый текст"
408 msgstr "Зачеркнутый текст"
409
409
410 #: templates/boards/staticpages/help.html:16
410 #: templates/boards/staticpages/help.html:16
411 msgid "Comment"
411 msgid "Comment"
412 msgstr "Комментарий"
412 msgstr "Комментарий"
413
413
414 #: templates/boards/staticpages/help.html:17
414 #: templates/boards/staticpages/help.html:17
415 #: templates/boards/staticpages/help.html:18
415 #: templates/boards/staticpages/help.html:18
416 msgid "Quote"
416 msgid "Quote"
417 msgstr "Цитата"
417 msgstr "Цитата"
418
418
419 #: templates/boards/staticpages/help.html:21
419 #: templates/boards/staticpages/help.html:21
420 msgid "You can try pasting the text and previewing the result here:"
420 msgid "You can try pasting the text and previewing the result here:"
421 msgstr "Вы можете попробовать вставить текст и проверить результат здесь:"
421 msgstr "Вы можете попробовать вставить текст и проверить результат здесь:"
422
422
423 #: templates/boards/tags.html:17
423 #: templates/boards/tags.html:17
424 msgid "Sections:"
424 msgid "Sections:"
425 msgstr "Разделы:"
425 msgstr "Разделы:"
426
426
427 #: templates/boards/tags.html:30
427 #: templates/boards/tags.html:30
428 msgid "Other tags:"
428 msgid "Other tags:"
429 msgstr "Другие метки:"
429 msgstr "Другие метки:"
430
430
431 #: templates/boards/tags.html:43
431 #: templates/boards/tags.html:43
432 msgid "All tags..."
432 msgid "All tags..."
433 msgstr "Все метки..."
433 msgstr "Все метки..."
434
434
435 #: templates/boards/thread.html:14
435 #: templates/boards/thread.html:14
436 msgid "Normal"
436 msgid "Normal"
437 msgstr "Нормальный"
437 msgstr "Нормальный"
438
438
439 #: templates/boards/thread.html:15
439 #: templates/boards/thread.html:15
440 msgid "Gallery"
440 msgid "Gallery"
441 msgstr "Галерея"
441 msgstr "Галерея"
442
442
443 #: templates/boards/thread.html:16
443 #: templates/boards/thread.html:16
444 msgid "Tree"
444 msgid "Tree"
445 msgstr "Дерево"
445 msgstr "Дерево"
446
446
447 #: templates/boards/thread.html:35
447 #: templates/boards/thread.html:35
448 msgid "message"
448 msgid "message"
449 msgid_plural "messages"
449 msgid_plural "messages"
450 msgstr[0] "сообщение"
450 msgstr[0] "сообщение"
451 msgstr[1] "сообщения"
451 msgstr[1] "сообщения"
452 msgstr[2] "сообщений"
452 msgstr[2] "сообщений"
453
453
454 #: templates/boards/thread.html:38
454 #: templates/boards/thread.html:38
455 msgid "image"
455 msgid "image"
456 msgid_plural "images"
456 msgid_plural "images"
457 msgstr[0] "изображение"
457 msgstr[0] "изображение"
458 msgstr[1] "изображения"
458 msgstr[1] "изображения"
459 msgstr[2] "изображений"
459 msgstr[2] "изображений"
460
460
461 #: templates/boards/thread.html:40
461 #: templates/boards/thread.html:40
462 msgid "Last update: "
462 msgid "Last update: "
463 msgstr "Последнее обновление: "
463 msgstr "Последнее обновление: "
464
464
465 #: templates/boards/thread_gallery.html:36
465 #: templates/boards/thread_gallery.html:36
466 msgid "No images."
466 msgid "No images."
467 msgstr "Нет изображений."
467 msgstr "Нет изображений."
468
468
469 #: templates/boards/thread_normal.html:30
469 #: templates/boards/thread_normal.html:30
470 msgid "posts to bumplimit"
470 msgid "posts to bumplimit"
471 msgstr "сообщений до бамплимита"
471 msgstr "сообщений до бамплимита"
472
472
473 #: templates/boards/thread_normal.html:44
473 #: templates/boards/thread_normal.html:44
474 msgid "Reply to thread"
474 msgid "Reply to thread"
475 msgstr "Ответить в тему"
475 msgstr "Ответить в тему"
476
476
477 #: templates/boards/thread_normal.html:44
477 #: templates/boards/thread_normal.html:44
478 msgid "to message "
478 msgid "to message "
479 msgstr "на сообщение"
479 msgstr "на сообщение"
480
480
481 #: templates/boards/thread_normal.html:59
481 #: templates/boards/thread_normal.html:59
482 msgid "Close form"
482 msgid "Close form"
483 msgstr "Закрыть форму"
483 msgstr "Закрыть форму"
484
484
485 #: templates/search/search.html:17
485 #: templates/search/search.html:17
486 msgid "Ok"
486 msgid "Ok"
487 msgstr "Ок"
487 msgstr "Ок"
488
488
489 #: utils.py:120
489 #: utils.py:120
490 #, python-format
490 #, python-format
491 msgid "File must be less than %s bytes"
491 msgid "File must be less than %s bytes"
492 msgstr "Файл должен быть менее %s байт"
492 msgstr "Файл должен быть менее %s байт"
493
493
494 msgid "Please wait %(delay)d second before sending message"
494 msgid "Please wait %(delay)d second before sending message"
495 msgid_plural "Please wait %(delay)d seconds before sending message"
495 msgid_plural "Please wait %(delay)d seconds before sending message"
496 msgstr[0] "Пожалуйста подождите %(delay)d секунду перед отправкой сообщения"
496 msgstr[0] "Пожалуйста подождите %(delay)d секунду перед отправкой сообщения"
497 msgstr[1] "Пожалуйста подождите %(delay)d секунды перед отправкой сообщения"
497 msgstr[1] "Пожалуйста подождите %(delay)d секунды перед отправкой сообщения"
498 msgstr[2] "Пожалуйста подождите %(delay)d секунд перед отправкой сообщения"
498 msgstr[2] "Пожалуйста подождите %(delay)d секунд перед отправкой сообщения"
499
499
500 msgid "New threads"
500 msgid "New threads"
501 msgstr "Новые темы"
501 msgstr "Новые темы"
502
503 #, python-format
504 msgid "Max file size is %(size)s."
505 msgstr "Максимальный размер файла %(size)s."
@@ -1,186 +1,189 b''
1 {% extends "boards/base.html" %}
1 {% extends "boards/base.html" %}
2
2
3 {% load i18n %}
3 {% load i18n %}
4 {% load board %}
4 {% load board %}
5 {% load static %}
5 {% load static %}
6 {% load tz %}
6 {% load tz %}
7
7
8 {% block head %}
8 {% block head %}
9 <meta name="robots" content="noindex">
9 <meta name="robots" content="noindex">
10
10
11 {% if tag %}
11 {% if tag %}
12 <title>{{ tag.name }} - {{ site_name }}</title>
12 <title>{{ tag.name }} - {{ site_name }}</title>
13 {% else %}
13 {% else %}
14 <title>{{ site_name }}</title>
14 <title>{{ site_name }}</title>
15 {% endif %}
15 {% endif %}
16
16
17 {% if prev_page_link %}
17 {% if prev_page_link %}
18 <link rel="prev" href="{{ prev_page_link }}" />
18 <link rel="prev" href="{{ prev_page_link }}" />
19 {% endif %}
19 {% endif %}
20 {% if next_page_link %}
20 {% if next_page_link %}
21 <link rel="next" href="{{ next_page_link }}" />
21 <link rel="next" href="{{ next_page_link }}" />
22 {% endif %}
22 {% endif %}
23
23
24 {% endblock %}
24 {% endblock %}
25
25
26 {% block content %}
26 {% block content %}
27
27
28 {% get_current_language as LANGUAGE_CODE %}
28 {% get_current_language as LANGUAGE_CODE %}
29 {% get_current_timezone as TIME_ZONE %}
29 {% get_current_timezone as TIME_ZONE %}
30
30
31 {% for banner in banners %}
31 {% for banner in banners %}
32 <div class="post">
32 <div class="post">
33 <div class="title">{{ banner.title }}</div>
33 <div class="title">{{ banner.title }}</div>
34 <div>{{ banner.text }}</div>
34 <div>{{ banner.text }}</div>
35 <div>{% trans 'Related message' %}: <a href="{{ banner.post.get_absolute_url }}">>>{{ banner.post.id }}</a></div>
35 <div>{% trans 'Related message' %}: <a href="{{ banner.post.get_absolute_url }}">>>{{ banner.post.id }}</a></div>
36 </div>
36 </div>
37 {% endfor %}
37 {% endfor %}
38
38
39 {% if tag %}
39 {% if tag %}
40 <div class="tag_info" style="border-bottom: solid .5ex #{{ tag.get_color }}">
40 <div class="tag_info" style="border-bottom: solid .5ex #{{ tag.get_color }}">
41 {% if random_image_post %}
41 {% if random_image_post %}
42 <div class="tag-image">
42 <div class="tag-image">
43 {% with image=random_image_post.images.first %}
43 {% with image=random_image_post.images.first %}
44 <a href="{{ random_image_post.get_absolute_url }}"><img
44 <a href="{{ random_image_post.get_absolute_url }}"><img
45 src="{{ image.image.url_200x150 }}"
45 src="{{ image.image.url_200x150 }}"
46 width="{{ image.pre_width }}"
46 width="{{ image.pre_width }}"
47 height="{{ image.pre_height }}"/></a>
47 height="{{ image.pre_height }}"/></a>
48 {% endwith %}
48 {% endwith %}
49 </div>
49 </div>
50 {% endif %}
50 {% endif %}
51 <div class="tag-text-data">
51 <div class="tag-text-data">
52 <h2>
52 <h2>
53 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
53 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
54 {% if is_favorite %}
54 {% if is_favorite %}
55 <button name="method" value="unsubscribe" class="fav"></button>
55 <button name="method" value="unsubscribe" class="fav"></button>
56 {% else %}
56 {% else %}
57 <button name="method" value="subscribe" class="not_fav"></button>
57 <button name="method" value="subscribe" class="not_fav"></button>
58 {% endif %}
58 {% endif %}
59 </form>
59 </form>
60 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
60 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
61 {% if is_hidden %}
61 {% if is_hidden %}
62 <button name="method" value="unhide" class="fav">H</button>
62 <button name="method" value="unhide" class="fav">H</button>
63 {% else %}
63 {% else %}
64 <button name="method" value="hide" class="not_fav">H</button>
64 <button name="method" value="hide" class="not_fav">H</button>
65 {% endif %}
65 {% endif %}
66 </form>
66 </form>
67 {{ tag.get_view|safe }}
67 {{ tag.get_view|safe }}
68 {% if perms.change_tag %}
68 {% if perms.change_tag %}
69 <span class="moderator_info">| <a href="{% url 'admin:boards_tag_change' tag.id %}">{% trans 'Edit tag' %}</a></span>
69 <span class="moderator_info">| <a href="{% url 'admin:boards_tag_change' tag.id %}">{% trans 'Edit tag' %}</a></span>
70 {% endif %}
70 {% endif %}
71 </h2>
71 </h2>
72 {% if tag.get_description %}
72 {% if tag.get_description %}
73 <p>{{ tag.get_description|safe }}</p>
73 <p>{{ tag.get_description|safe }}</p>
74 {% endif %}
74 {% endif %}
75 <p>
75 <p>
76 {% blocktrans count count=tag.get_active_thread_count %}{{ count }} active thread{% plural %}active threads{% endblocktrans %},
76 {% blocktrans count count=tag.get_active_thread_count %}{{ count }} active thread{% plural %}active threads{% endblocktrans %},
77 {% blocktrans count count=tag.get_bumplimit_thread_count %}{{ count }} thread in bumplimit{% plural %} threads in bumplimit{% endblocktrans %},
77 {% blocktrans count count=tag.get_bumplimit_thread_count %}{{ count }} thread in bumplimit{% plural %} threads in bumplimit{% endblocktrans %},
78 {% blocktrans count count=tag.get_archived_thread_count %}{{ count }} archived thread{% plural %}archived threads{% endblocktrans %},
78 {% blocktrans count count=tag.get_archived_thread_count %}{{ count }} archived thread{% plural %}archived threads{% endblocktrans %},
79 {% blocktrans count count=tag.get_post_count %}{{ count }} message{% plural %}messages{% endblocktrans %}.
79 {% blocktrans count count=tag.get_post_count %}{{ count }} message{% plural %}messages{% endblocktrans %}.
80 </p>
80 </p>
81 {% if tag.get_all_parents %}
81 {% if tag.get_all_parents %}
82 <p>
82 <p>
83 {% for parent in tag.get_all_parents %}
83 {% for parent in tag.get_all_parents %}
84 {{ parent.get_view|safe }} &gt;
84 {{ parent.get_view|safe }} &gt;
85 {% endfor %}
85 {% endfor %}
86 {{ tag.get_view|safe }}
86 {{ tag.get_view|safe }}
87 </p>
87 </p>
88 {% endif %}
88 {% endif %}
89 </div>
89 </div>
90 </div>
90 </div>
91 {% endif %}
91 {% endif %}
92
92
93 {% if threads %}
93 {% if threads %}
94 {% if prev_page_link %}
94 {% if prev_page_link %}
95 <div class="page_link">
95 <div class="page_link">
96 <a href="{{ prev_page_link }}">{% trans "Previous page" %}</a>
96 <a href="{{ prev_page_link }}">{% trans "Previous page" %}</a>
97 </div>
97 </div>
98 {% endif %}
98 {% endif %}
99
99
100 {% for thread in threads %}
100 {% for thread in threads %}
101 <div class="thread">
101 <div class="thread">
102 {% post_view thread.get_opening_post thread=thread truncated=True need_open_link=True %}
102 {% post_view thread.get_opening_post thread=thread truncated=True need_open_link=True %}
103 {% if not thread.archived %}
103 {% if not thread.archived %}
104 {% with last_replies=thread.get_last_replies %}
104 {% with last_replies=thread.get_last_replies %}
105 {% if last_replies %}
105 {% if last_replies %}
106 {% with skipped_replies_count=thread.get_skipped_replies_count %}
106 {% with skipped_replies_count=thread.get_skipped_replies_count %}
107 {% if skipped_replies_count %}
107 {% if skipped_replies_count %}
108 <div class="skipped_replies">
108 <div class="skipped_replies">
109 <a href="{% url 'thread' thread.get_opening_post_id %}">
109 <a href="{% url 'thread' thread.get_opening_post_id %}">
110 {% blocktrans count count=skipped_replies_count %}Skipped {{ count }} reply. Open thread to see all replies.{% plural %}Skipped {{ count }} replies. Open thread to see all replies.{% endblocktrans %}
110 {% blocktrans count count=skipped_replies_count %}Skipped {{ count }} reply. Open thread to see all replies.{% plural %}Skipped {{ count }} replies. Open thread to see all replies.{% endblocktrans %}
111 </a>
111 </a>
112 </div>
112 </div>
113 {% endif %}
113 {% endif %}
114 {% endwith %}
114 {% endwith %}
115 <div class="last-replies">
115 <div class="last-replies">
116 {% for post in last_replies %}
116 {% for post in last_replies %}
117 {% post_view post truncated=True %}
117 {% post_view post truncated=True %}
118 {% endfor %}
118 {% endfor %}
119 </div>
119 </div>
120 {% endif %}
120 {% endif %}
121 {% endwith %}
121 {% endwith %}
122 {% endif %}
122 {% endif %}
123 </div>
123 </div>
124 {% endfor %}
124 {% endfor %}
125
125
126 {% if next_page_link %}
126 {% if next_page_link %}
127 <div class="page_link">
127 <div class="page_link">
128 <a href="{{ next_page_link }}">{% trans "Next page" %}</a>
128 <a href="{{ next_page_link }}">{% trans "Next page" %}</a>
129 </div>
129 </div>
130 {% endif %}
130 {% endif %}
131 {% else %}
131 {% else %}
132 <div class="post">
132 <div class="post">
133 {% trans 'No threads exist. Create the first one!' %}</div>
133 {% trans 'No threads exist. Create the first one!' %}</div>
134 {% endif %}
134 {% endif %}
135
135
136 <div class="post-form-w">
136 <div class="post-form-w">
137 <script src="{% static 'js/panel.js' %}"></script>
137 <script src="{% static 'js/panel.js' %}"></script>
138 <div class="post-form">
138 <div class="post-form">
139 <div class="form-title">{% trans "Create new thread" %}</div>
139 <div class="form-title">{% trans "Create new thread" %}</div>
140 <div class="swappable-form-full">
140 <div class="swappable-form-full">
141 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
141 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
142 {{ form.as_div }}
142 {{ form.as_div }}
143 <div class="form-submit">
143 <div class="form-submit">
144 <input type="submit" value="{% trans "Post" %}"/>
144 <input type="submit" value="{% trans "Post" %}"/>
145 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
145 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
146 </div>
146 </div>
147 </form>
147 </form>
148 </div>
148 </div>
149 <div>
149 <div>
150 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
150 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
151 {% with size=max_file_size|filesizeformat %}
152 {% blocktrans %}Max file size is {{ size }}.{% endblocktrans %}
153 {% endwith %}
151 </div>
154 </div>
152 <div id="preview-text"></div>
155 <div id="preview-text"></div>
153 <div><a href="{% url "staticpage" name="help" %}">{% trans 'Text syntax' %}</a></div>
156 <div><a href="{% url "staticpage" name="help" %}">{% trans 'Text syntax' %}</a></div>
154 <div><a href="{% url "tags" "required" %}">{% trans 'Tags' %}</a></div>
157 <div><a href="{% url "tags" "required" %}">{% trans 'Tags' %}</a></div>
155 </div>
158 </div>
156 </div>
159 </div>
157
160
158 <script src="{% static 'js/form.js' %}"></script>
161 <script src="{% static 'js/form.js' %}"></script>
159 <script src="{% static 'js/thread_create.js' %}"></script>
162 <script src="{% static 'js/thread_create.js' %}"></script>
160
163
161 {% endblock %}
164 {% endblock %}
162
165
163 {% block metapanel %}
166 {% block metapanel %}
164
167
165 <span class="metapanel">
168 <span class="metapanel">
166 <b><a href="{% url "authors" %}">{{ site_name }}</a> {{ version }}</b>
169 <b><a href="{% url "authors" %}">{{ site_name }}</a> {{ version }}</b>
167 {% trans "Pages:" %}
170 {% trans "Pages:" %}
168 [
171 [
169 {% with dividers=paginator.get_dividers %}
172 {% with dividers=paginator.get_dividers %}
170 {% for page in paginator.get_divided_range %}
173 {% for page in paginator.get_divided_range %}
171 {% if page in dividers %}
174 {% if page in dividers %}
172 …,
175 …,
173 {% endif %}
176 {% endif %}
174 <a
177 <a
175 {% ifequal page current_page.number %}
178 {% ifequal page current_page.number %}
176 class="current_page"
179 class="current_page"
177 {% endifequal %}
180 {% endifequal %}
178 href="{% page_url paginator page %}">{{ page }}</a>
181 href="{% page_url paginator page %}">{{ page }}</a>
179 {% if not forloop.last %},{% endif %}
182 {% if not forloop.last %},{% endif %}
180 {% endfor %}
183 {% endfor %}
181 {% endwith %}
184 {% endwith %}
182 ]
185 ]
183 [<a href="rss/">RSS</a>]
186 [<a href="rss/">RSS</a>]
184 </span>
187 </span>
185
188
186 {% endblock %}
189 {% endblock %}
@@ -1,70 +1,75 b''
1 {% extends "boards/thread.html" %}
1 {% extends "boards/thread.html" %}
2
2
3 {% load i18n %}
3 {% load i18n %}
4 {% load static from staticfiles %}
4 {% load static from staticfiles %}
5 {% load board %}
5 {% load board %}
6 {% load tz %}
6 {% load tz %}
7
7
8 {% block thread_content %}
8 {% block thread_content %}
9 {% get_current_language as LANGUAGE_CODE %}
9 {% get_current_language as LANGUAGE_CODE %}
10 {% get_current_timezone as TIME_ZONE %}
10 {% get_current_timezone as TIME_ZONE %}
11
11
12 <div class="tag_info">
12 <div class="tag_info">
13 <h2>
13 <h2>
14 <form action="{% url 'thread' opening_post.id %}" method="post" class="post-button-form">
14 <form action="{% url 'thread' opening_post.id %}" method="post" class="post-button-form">
15 {% if is_favorite %}
15 {% if is_favorite %}
16 <button name="method" value="unsubscribe" class="fav"></button>
16 <button name="method" value="unsubscribe" class="fav"></button>
17 {% else %}
17 {% else %}
18 <button name="method" value="subscribe" class="not_fav"></button>
18 <button name="method" value="subscribe" class="not_fav"></button>
19 {% endif %}
19 {% endif %}
20 </form>
20 </form>
21 {{ opening_post.get_title_or_text }}
21 {{ opening_post.get_title_or_text }}
22 </h2>
22 </h2>
23 </div>
23 </div>
24
24
25 {% if bumpable and thread.has_post_limit %}
25 {% if bumpable and thread.has_post_limit %}
26 <div class="bar-bg">
26 <div class="bar-bg">
27 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
27 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
28 </div>
28 </div>
29 <div class="bar-text">
29 <div class="bar-text">
30 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
30 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
31 </div>
31 </div>
32 </div>
32 </div>
33 {% endif %}
33 {% endif %}
34
34
35 <div class="thread">
35 <div class="thread">
36 {% for post in thread.get_replies %}
36 {% for post in thread.get_replies %}
37 {% post_view post reply_link=True %}
37 {% post_view post reply_link=True %}
38 {% endfor %}
38 {% endfor %}
39 </div>
39 </div>
40
40
41 {% if not thread.archived %}
41 {% if not thread.archived %}
42 <div class="post-form-w">
42 <div class="post-form-w">
43 <script src="{% static 'js/panel.js' %}"></script>
43 <script src="{% static 'js/panel.js' %}"></script>
44 <div class="form-title">{% trans "Reply to thread" %} #{{ opening_post.id }}<span class="reply-to-message"> {% trans "to message " %} #<span id="reply-to-message-id"></span></span></div>
44 <div class="form-title">{% trans "Reply to thread" %} #{{ opening_post.id }}<span class="reply-to-message"> {% trans "to message " %} #<span id="reply-to-message-id"></span></span></div>
45 <div class="post-form" id="compact-form">
45 <div class="post-form" id="compact-form">
46 <div class="swappable-form-full">
46 <div class="swappable-form-full">
47 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
47 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
48 <div class="compact-form-text"></div>
48 <div class="compact-form-text"></div>
49 {{ form.as_div }}
49 {{ form.as_div }}
50 <div class="form-submit">
50 <div class="form-submit">
51 <input type="submit" value="{% trans "Post" %}"/>
51 <input type="submit" value="{% trans "Post" %}"/>
52 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
52 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
53 </div>
53 </div>
54 </form>
54 </form>
55 </div>
55 </div>
56 <div id="preview-text"></div>
56 <div id="preview-text"></div>
57 <div>
58 {% with size=max_file_size|filesizeformat %}
59 {% blocktrans %}Max file size is {{ size }}.{% endblocktrans %}
60 {% endwith %}
61 </div>
57 <div><a href="{% url "staticpage" name="help" %}">
62 <div><a href="{% url "staticpage" name="help" %}">
58 {% trans 'Text syntax' %}</a></div>
63 {% trans 'Text syntax' %}</a></div>
59 <div><a id="form-close-button" href="#" onClick="resetFormPosition(); return false;">{% trans 'Close form' %}</a></div>
64 <div><a id="form-close-button" href="#" onClick="resetFormPosition(); return false;">{% trans 'Close form' %}</a></div>
60 </div>
65 </div>
61 </div>
66 </div>
62
67
63 <script src="{% static 'js/jquery.form.min.js' %}"></script>
68 <script src="{% static 'js/jquery.form.min.js' %}"></script>
64 {% endif %}
69 {% endif %}
65
70
66 <script src="{% static 'js/form.js' %}"></script>
71 <script src="{% static 'js/form.js' %}"></script>
67 <script src="{% static 'js/thread.js' %}"></script>
72 <script src="{% static 'js/thread.js' %}"></script>
68 <script src="{% static 'js/thread_update.js' %}"></script>
73 <script src="{% static 'js/thread_update.js' %}"></script>
69 <script src="{% static 'js/3party/centrifuge.js' %}"></script>
74 <script src="{% static 'js/3party/centrifuge.js' %}"></script>
70 {% endblock %}
75 {% endblock %}
@@ -1,157 +1,160 b''
1 from django.core.urlresolvers import reverse
1 from django.core.urlresolvers import reverse
2 from django.core.files import File
2 from django.core.files import File
3 from django.core.files.temp import NamedTemporaryFile
3 from django.core.files.temp import NamedTemporaryFile
4 from django.core.paginator import EmptyPage
4 from django.core.paginator import EmptyPage
5 from django.db import transaction
5 from django.db import transaction
6 from django.http import Http404
6 from django.http import Http404
7 from django.shortcuts import render, redirect
7 from django.shortcuts import render, redirect
8 import requests
8 import requests
9
9
10 from boards import utils, settings
10 from boards import utils, settings
11 from boards.abstracts.paginator import get_paginator
11 from boards.abstracts.paginator import get_paginator
12 from boards.abstracts.settingsmanager import get_settings_manager
12 from boards.abstracts.settingsmanager import get_settings_manager
13 from boards.forms import ThreadForm, PlainErrorList
13 from boards.forms import ThreadForm, PlainErrorList
14 from boards.models import Post, Thread, Ban, Tag, PostImage, Banner
14 from boards.models import Post, Thread, Ban, Tag, PostImage, Banner
15 from boards.views.banned import BannedView
15 from boards.views.banned import BannedView
16 from boards.views.base import BaseBoardView, CONTEXT_FORM
16 from boards.views.base import BaseBoardView, CONTEXT_FORM
17 from boards.views.posting_mixin import PostMixin
17 from boards.views.posting_mixin import PostMixin
18 from boards.views.mixins import FileUploadMixin
18
19
19
20
20 FORM_TAGS = 'tags'
21 FORM_TAGS = 'tags'
21 FORM_TEXT = 'text'
22 FORM_TEXT = 'text'
22 FORM_TITLE = 'title'
23 FORM_TITLE = 'title'
23 FORM_IMAGE = 'image'
24 FORM_IMAGE = 'image'
24 FORM_THREADS = 'threads'
25 FORM_THREADS = 'threads'
25
26
26 TAG_DELIMITER = ' '
27 TAG_DELIMITER = ' '
27
28
28 PARAMETER_CURRENT_PAGE = 'current_page'
29 PARAMETER_CURRENT_PAGE = 'current_page'
29 PARAMETER_PAGINATOR = 'paginator'
30 PARAMETER_PAGINATOR = 'paginator'
30 PARAMETER_THREADS = 'threads'
31 PARAMETER_THREADS = 'threads'
31 PARAMETER_BANNERS = 'banners'
32 PARAMETER_BANNERS = 'banners'
32 PARAMETER_ADDITIONAL = 'additional_params'
33 PARAMETER_ADDITIONAL = 'additional_params'
34 PARAMETER_MAX_FILE_SIZE = 'max_file_size'
33
35
34 PARAMETER_PREV_LINK = 'prev_page_link'
36 PARAMETER_PREV_LINK = 'prev_page_link'
35 PARAMETER_NEXT_LINK = 'next_page_link'
37 PARAMETER_NEXT_LINK = 'next_page_link'
36
38
37 TEMPLATE = 'boards/all_threads.html'
39 TEMPLATE = 'boards/all_threads.html'
38 DEFAULT_PAGE = 1
40 DEFAULT_PAGE = 1
39
41
40
42
41 class AllThreadsView(PostMixin, BaseBoardView):
43 class AllThreadsView(PostMixin, FileUploadMixin, BaseBoardView):
42
44
43 def __init__(self):
45 def __init__(self):
44 self.settings_manager = None
46 self.settings_manager = None
45 super(AllThreadsView, self).__init__()
47 super(AllThreadsView, self).__init__()
46
48
47 def get(self, request, form: ThreadForm=None):
49 def get(self, request, form: ThreadForm=None):
48 page = request.GET.get('page', DEFAULT_PAGE)
50 page = request.GET.get('page', DEFAULT_PAGE)
49
51
50 params = self.get_context_data(request=request)
52 params = self.get_context_data(request=request)
51
53
52 if not form:
54 if not form:
53 form = ThreadForm(error_class=PlainErrorList)
55 form = ThreadForm(error_class=PlainErrorList)
54
56
55 self.settings_manager = get_settings_manager(request)
57 self.settings_manager = get_settings_manager(request)
56
58
57 threads = self.get_threads()
59 threads = self.get_threads()
58
60
59 order = request.GET.get('order', 'bump')
61 order = request.GET.get('order', 'bump')
60 if order == 'bump':
62 if order == 'bump':
61 threads = threads.order_by('-bump_time')
63 threads = threads.order_by('-bump_time')
62 else:
64 else:
63 threads = threads.filter(multi_replies__opening=True).order_by('-multi_replies__pub_time')
65 threads = threads.filter(multi_replies__opening=True).order_by('-multi_replies__pub_time')
64
66
65 paginator = get_paginator(threads,
67 paginator = get_paginator(threads,
66 settings.get_int('View', 'ThreadsPerPage'))
68 settings.get_int('View', 'ThreadsPerPage'))
67 paginator.current_page = int(page)
69 paginator.current_page = int(page)
68
70
69 try:
71 try:
70 threads = paginator.page(page).object_list
72 threads = paginator.page(page).object_list
71 except EmptyPage:
73 except EmptyPage:
72 raise Http404()
74 raise Http404()
73
75
74 params[PARAMETER_THREADS] = threads
76 params[PARAMETER_THREADS] = threads
75 params[CONTEXT_FORM] = form
77 params[CONTEXT_FORM] = form
76 params[PARAMETER_BANNERS] = Banner.objects.order_by('-id').all()
78 params[PARAMETER_BANNERS] = Banner.objects.order_by('-id').all()
79 params[PARAMETER_MAX_FILE_SIZE] = self.get_max_upload_size()
77
80
78 paginator.set_url(self.get_reverse_url(), request.GET.dict())
81 paginator.set_url(self.get_reverse_url(), request.GET.dict())
79 self.get_page_context(paginator, params, page)
82 self.get_page_context(paginator, params, page)
80
83
81 return render(request, TEMPLATE, params)
84 return render(request, TEMPLATE, params)
82
85
83 def post(self, request):
86 def post(self, request):
84 form = ThreadForm(request.POST, request.FILES,
87 form = ThreadForm(request.POST, request.FILES,
85 error_class=PlainErrorList)
88 error_class=PlainErrorList)
86 form.session = request.session
89 form.session = request.session
87
90
88 if form.is_valid():
91 if form.is_valid():
89 return self.create_thread(request, form)
92 return self.create_thread(request, form)
90 if form.need_to_ban:
93 if form.need_to_ban:
91 # Ban user because he is suspected to be a bot
94 # Ban user because he is suspected to be a bot
92 self._ban_current_user(request)
95 self._ban_current_user(request)
93
96
94 return self.get(request, form)
97 return self.get(request, form)
95
98
96 def get_page_context(self, paginator, params, page):
99 def get_page_context(self, paginator, params, page):
97 """
100 """
98 Get pagination context variables
101 Get pagination context variables
99 """
102 """
100
103
101 params[PARAMETER_PAGINATOR] = paginator
104 params[PARAMETER_PAGINATOR] = paginator
102 current_page = paginator.page(int(page))
105 current_page = paginator.page(int(page))
103 params[PARAMETER_CURRENT_PAGE] = current_page
106 params[PARAMETER_CURRENT_PAGE] = current_page
104 if current_page.has_previous():
107 if current_page.has_previous():
105 params[PARAMETER_PREV_LINK] = paginator.get_page_url(
108 params[PARAMETER_PREV_LINK] = paginator.get_page_url(
106 current_page.previous_page_number())
109 current_page.previous_page_number())
107 if current_page.has_next():
110 if current_page.has_next():
108 params[PARAMETER_NEXT_LINK] = paginator.get_page_url(
111 params[PARAMETER_NEXT_LINK] = paginator.get_page_url(
109 current_page.next_page_number())
112 current_page.next_page_number())
110
113
111 def get_reverse_url(self):
114 def get_reverse_url(self):
112 return reverse('index')
115 return reverse('index')
113
116
114 @transaction.atomic
117 @transaction.atomic
115 def create_thread(self, request, form: ThreadForm, html_response=True):
118 def create_thread(self, request, form: ThreadForm, html_response=True):
116 """
119 """
117 Creates a new thread with an opening post.
120 Creates a new thread with an opening post.
118 """
121 """
119
122
120 ip = utils.get_client_ip(request)
123 ip = utils.get_client_ip(request)
121 is_banned = Ban.objects.filter(ip=ip).exists()
124 is_banned = Ban.objects.filter(ip=ip).exists()
122
125
123 if is_banned:
126 if is_banned:
124 if html_response:
127 if html_response:
125 return redirect(BannedView().as_view())
128 return redirect(BannedView().as_view())
126 else:
129 else:
127 return
130 return
128
131
129 data = form.cleaned_data
132 data = form.cleaned_data
130
133
131 title = form.get_title()
134 title = form.get_title()
132 text = data[FORM_TEXT]
135 text = data[FORM_TEXT]
133 file = form.get_file()
136 file = form.get_file()
134 threads = data[FORM_THREADS]
137 threads = data[FORM_THREADS]
135
138
136 text = self._remove_invalid_links(text)
139 text = self._remove_invalid_links(text)
137
140
138 tags = data[FORM_TAGS]
141 tags = data[FORM_TAGS]
139
142
140 post = Post.objects.create_post(title=title, text=text, file=file,
143 post = Post.objects.create_post(title=title, text=text, file=file,
141 ip=ip, tags=tags, opening_posts=threads,
144 ip=ip, tags=tags, opening_posts=threads,
142 tripcode=form.get_tripcode())
145 tripcode=form.get_tripcode())
143
146
144 # This is required to update the threads to which posts we have replied
147 # This is required to update the threads to which posts we have replied
145 # when creating this one
148 # when creating this one
146 post.notify_clients()
149 post.notify_clients()
147
150
148 if html_response:
151 if html_response:
149 return redirect(post.get_absolute_url())
152 return redirect(post.get_absolute_url())
150
153
151 def get_threads(self):
154 def get_threads(self):
152 """
155 """
153 Gets list of threads that will be shown on a page.
156 Gets list of threads that will be shown on a page.
154 """
157 """
155
158
156 return Thread.objects\
159 return Thread.objects\
157 .exclude(tags__in=self.settings_manager.get_hidden_tags())
160 .exclude(tags__in=self.settings_manager.get_hidden_tags())
@@ -1,26 +1,34 b''
1 import boards
2
3
1 PARAM_NEXT = 'next'
4 PARAM_NEXT = 'next'
2 PARAMETER_METHOD = 'method'
5 PARAMETER_METHOD = 'method'
3
6
4
7
5 class DispatcherMixin:
8 class DispatcherMixin:
6 """
9 """
7 This class contains a dispather method that can run a method specified by
10 This class contains a dispather method that can run a method specified by
8 'method' request parameter.
11 'method' request parameter.
9 """
12 """
10
13
11 def __init__(self):
14 def __init__(self):
12 self.user = None
15 self.user = None
13
16
14 def dispatch_method(self, *args, **kwargs):
17 def dispatch_method(self, *args, **kwargs):
15 request = args[0]
18 request = args[0]
16
19
17 self.user = request.user
20 self.user = request.user
18
21
19 method_name = None
22 method_name = None
20 if PARAMETER_METHOD in request.GET:
23 if PARAMETER_METHOD in request.GET:
21 method_name = request.GET[PARAMETER_METHOD]
24 method_name = request.GET[PARAMETER_METHOD]
22 elif PARAMETER_METHOD in request.POST:
25 elif PARAMETER_METHOD in request.POST:
23 method_name = request.POST[PARAMETER_METHOD]
26 method_name = request.POST[PARAMETER_METHOD]
24
27
25 if method_name:
28 if method_name:
26 return getattr(self, method_name)(*args, **kwargs)
29 return getattr(self, method_name)(*args, **kwargs)
30
31
32 class FileUploadMixin:
33 def get_max_upload_size(self):
34 return boards.settings.get_int('Forms', 'MaxFileSize')
@@ -1,30 +1,33 b''
1 from boards.views.thread import ThreadView
1 from boards.views.thread import ThreadView
2 from boards.views.mixins import FileUploadMixin
2
3
3 TEMPLATE_NORMAL = 'boards/thread_normal.html'
4 TEMPLATE_NORMAL = 'boards/thread_normal.html'
4
5
5 CONTEXT_BUMPLIMIT_PRG = 'bumplimit_progress'
6 CONTEXT_BUMPLIMIT_PRG = 'bumplimit_progress'
6 CONTEXT_POSTS_LEFT = 'posts_left'
7 CONTEXT_POSTS_LEFT = 'posts_left'
7 CONTEXT_BUMPABLE = 'bumpable'
8 CONTEXT_BUMPABLE = 'bumpable'
9 PARAM_MAX_FILE_SIZE = 'max_file_size'
8
10
9
11
10 class NormalThreadView(ThreadView):
12 class NormalThreadView(ThreadView, FileUploadMixin):
11
13
12 def get_template(self):
14 def get_template(self):
13 return TEMPLATE_NORMAL
15 return TEMPLATE_NORMAL
14
16
15 def get_mode(self):
17 def get_mode(self):
16 return 'normal'
18 return 'normal'
17
19
18 def get_data(self, thread):
20 def get_data(self, thread):
19 params = dict()
21 params = dict()
20
22
21 bumpable = thread.can_bump()
23 bumpable = thread.can_bump()
22 params[CONTEXT_BUMPABLE] = bumpable
24 params[CONTEXT_BUMPABLE] = bumpable
23 max_posts = thread.max_posts
25 max_posts = thread.max_posts
24 if bumpable and thread.has_post_limit():
26 if bumpable and thread.has_post_limit():
25 left_posts = max_posts - thread.get_reply_count()
27 left_posts = max_posts - thread.get_reply_count()
26 params[CONTEXT_POSTS_LEFT] = left_posts
28 params[CONTEXT_POSTS_LEFT] = left_posts
27 params[CONTEXT_BUMPLIMIT_PRG] = str(
29 params[CONTEXT_BUMPLIMIT_PRG] = str(
28 float(left_posts) / max_posts * 100)
30 float(left_posts) / max_posts * 100)
31 params[PARAM_MAX_FILE_SIZE] = self.get_max_upload_size()
29
32
30 return params
33 return params
General Comments 0
You need to be logged in to leave comments. Login now