diff --git a/AUTHORS b/AUTHORS index bfaf6db6ca..7ee19bae66 100644 --- a/AUTHORS +++ b/AUTHORS @@ -95,6 +95,7 @@ answer newbie questions, and generally made Django that much better: Sengtha Chay ivan.chelubeev@gmail.com Bryan Chow + Antonis Christofides Michal Chruszcz Can Burak Çilingir Ian Clelland @@ -195,6 +196,7 @@ answer newbie questions, and generally made Django that much better: jcrasta@gmail.com jdetaeye Zak Johnson + Nis Jørgensen Michael Josephson jpellerin@gmail.com junzhang.jn@gmail.com diff --git a/django/conf/locale/mk/LC_MESSAGES/django.mo b/django/conf/locale/mk/LC_MESSAGES/django.mo index 21e3ff7c5d..6dfd651e76 100644 Binary files a/django/conf/locale/mk/LC_MESSAGES/django.mo and b/django/conf/locale/mk/LC_MESSAGES/django.mo differ diff --git a/django/conf/locale/mk/LC_MESSAGES/django.po b/django/conf/locale/mk/LC_MESSAGES/django.po index c28d098515..5e531a4d12 100644 --- a/django/conf/locale/mk/LC_MESSAGES/django.po +++ b/django/conf/locale/mk/LC_MESSAGES/django.po @@ -1,12 +1,12 @@ # translation of django.po to Macedonian # -# Georgi Stanojevski , 2006, 2007. +# Georgi Stanojevski , 2006, 2007, 2008. msgid "" msgstr "" -"Project-Id-Version: Django\n" +"Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-04-07 19:51+0200\n" -"PO-Revision-Date: 2007-04-07 20:29+0200\n" +"POT-Creation-Date: 2008-06-18 12:26+0200\n" +"PO-Revision-Date: 2008-06-28 16:36+0200\n" "Last-Translator: Georgi Stanojevski \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" @@ -15,750 +15,195 @@ msgstr "" "X-Generator: KBabel 1.11.4\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: db/models/manipulators.py:307 -#, python-format -msgid "%(object)s with this %(type)s already exists for the given %(field)s." -msgstr "%(object)s од овој тип %(type)s веќе постои за даденото %(field)s." - -#: db/models/manipulators.py:308 contrib/admin/views/main.py:335 -#: contrib/admin/views/main.py:337 contrib/admin/views/main.py:339 -msgid "and" -msgstr "и" - -#: db/models/fields/related.py:53 -#, python-format -msgid "Please enter a valid %s." -msgstr "Ве молам внесете правилно %s." - -#: db/models/fields/related.py:642 -msgid "Separate multiple IDs with commas." -msgstr "Одвојте ги идентификационите броеви со запирки." - -#: db/models/fields/related.py:644 -msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно." - -#: db/models/fields/related.py:691 -#, python-format -msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." -msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid." -msgstr[0] "" -"Ве молам внесете правилен %(self)s идентификацион број. Оваа вредност %" -"(value)r е неправилна." -msgstr[1] "" -"Ве молам внесете правилен %(self)s идентификацион број. Вредностите %(value)" -"r се неправилни." - -#: db/models/fields/__init__.py:42 -#, python-format -msgid "%(optname)s with this %(fieldname)s already exists." -msgstr "%(optname)s со ова %(fieldname)s веќе постои." - -#: db/models/fields/__init__.py:117 db/models/fields/__init__.py:274 -#: db/models/fields/__init__.py:610 db/models/fields/__init__.py:621 -#: oldforms/__init__.py:357 newforms/fields.py:80 newforms/fields.py:376 -#: newforms/fields.py:452 newforms/fields.py:463 newforms/models.py:178 -msgid "This field is required." -msgstr "Ова поле е задолжително." - -#: db/models/fields/__init__.py:367 -msgid "This value must be an integer." -msgstr "Оваа вредност мора да биде цел број." - -#: db/models/fields/__init__.py:402 -msgid "This value must be either True or False." -msgstr "Оваа вредност мора да биде или точно или неточно." - -#: db/models/fields/__init__.py:423 -msgid "This field cannot be null." -msgstr "Оваа вредност неможе да биде null." - -#: db/models/fields/__init__.py:457 core/validators.py:148 -msgid "Enter a valid date in YYYY-MM-DD format." -msgstr "Внесете правилен датум во форматот ГГГГ-ММ-ДД." - -#: db/models/fields/__init__.py:526 core/validators.py:157 -msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." -msgstr "Внесете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ." - -#: db/models/fields/__init__.py:630 -msgid "Enter a valid filename." -msgstr "Внесите правилно име на датотека." - -#: db/models/fields/__init__.py:751 -msgid "This value must be either None, True or False." -msgstr "Оваа вредност мора да биде празна, точно или неточно." - -#: conf/global_settings.py:39 +#: conf/global_settings.py:44 msgid "Arabic" msgstr "Арапски" -#: conf/global_settings.py:40 +#: conf/global_settings.py:45 msgid "Bengali" msgstr "Бенгалски" -#: conf/global_settings.py:41 +#: conf/global_settings.py:46 +msgid "Bulgarian" +msgstr "Бугарски" + +#: conf/global_settings.py:47 msgid "Catalan" msgstr "Каталански" -#: conf/global_settings.py:42 +#: conf/global_settings.py:48 msgid "Czech" msgstr "Чешки" -#: conf/global_settings.py:43 +#: conf/global_settings.py:49 msgid "Welsh" msgstr "Велшки" -#: conf/global_settings.py:44 +#: conf/global_settings.py:50 msgid "Danish" msgstr "Дански" -#: conf/global_settings.py:45 +#: conf/global_settings.py:51 msgid "German" msgstr "Германски" -#: conf/global_settings.py:46 +#: conf/global_settings.py:52 msgid "Greek" msgstr "Грчки" -#: conf/global_settings.py:47 +#: conf/global_settings.py:53 msgid "English" msgstr "Англиски" -#: conf/global_settings.py:48 +#: conf/global_settings.py:54 msgid "Spanish" msgstr "Шпански" -#: conf/global_settings.py:49 +#: conf/global_settings.py:55 msgid "Argentinean Spanish" msgstr "Аргентиско шпански" -#: conf/global_settings.py:50 +#: conf/global_settings.py:56 +msgid "Basque" +msgstr "Баскиски" + +#: conf/global_settings.py:57 +msgid "Persian" +msgstr "Персиски" + +#: conf/global_settings.py:58 msgid "Finnish" msgstr "Фински" -#: conf/global_settings.py:51 +#: conf/global_settings.py:59 msgid "French" msgstr "Француски" -#: conf/global_settings.py:52 +#: conf/global_settings.py:60 +msgid "Irish" +msgstr "Ирски" + +#: conf/global_settings.py:61 msgid "Galician" msgstr "Галски" -#: conf/global_settings.py:53 +#: conf/global_settings.py:62 msgid "Hungarian" msgstr "Унгарски" -#: conf/global_settings.py:54 +#: conf/global_settings.py:63 msgid "Hebrew" msgstr "Еврејски" -#: conf/global_settings.py:55 +#: conf/global_settings.py:64 +msgid "Croatian" +msgstr "Хрватски" + +#: conf/global_settings.py:65 msgid "Icelandic" msgstr "Исландски" -#: conf/global_settings.py:56 +#: conf/global_settings.py:66 msgid "Italian" msgstr "Италијански" -#: conf/global_settings.py:57 +#: conf/global_settings.py:67 msgid "Japanese" msgstr "Јапонски" -#: conf/global_settings.py:58 +#: conf/global_settings.py:68 +msgid "Georgian" +msgstr "Грузиски" + +#: conf/global_settings.py:69 +msgid "Korean" +msgstr "Корејски" + +#: conf/global_settings.py:70 +msgid "Khmer" +msgstr "Кмер" + +#: conf/global_settings.py:71 msgid "Kannada" msgstr "Канада" -#: conf/global_settings.py:59 +#: conf/global_settings.py:72 msgid "Latvian" msgstr "Латвиски" -#: conf/global_settings.py:60 +#: conf/global_settings.py:73 msgid "Macedonian" msgstr "Македонски" -#: conf/global_settings.py:61 +#: conf/global_settings.py:74 msgid "Dutch" msgstr "Холандски" -#: conf/global_settings.py:62 +#: conf/global_settings.py:75 msgid "Norwegian" msgstr "Норвешки" -#: conf/global_settings.py:63 +#: conf/global_settings.py:76 msgid "Polish" msgstr "Полски" -#: conf/global_settings.py:64 +#: conf/global_settings.py:77 msgid "Portugese" msgstr "Португалкски" -#: conf/global_settings.py:65 -msgid "Brazilian" -msgstr "Бразилски" +#: conf/global_settings.py:78 +msgid "Brazilian Portuguese" +msgstr "Бразилско португалски" -#: conf/global_settings.py:66 +#: conf/global_settings.py:79 msgid "Romanian" msgstr "Романски" -#: conf/global_settings.py:67 +#: conf/global_settings.py:80 msgid "Russian" msgstr "Руски" -#: conf/global_settings.py:68 +#: conf/global_settings.py:81 msgid "Slovak" msgstr "Словачки" -#: conf/global_settings.py:69 +#: conf/global_settings.py:82 msgid "Slovenian" msgstr "Словенечки" -#: conf/global_settings.py:70 +#: conf/global_settings.py:83 msgid "Serbian" msgstr "Српски" -#: conf/global_settings.py:71 +#: conf/global_settings.py:84 msgid "Swedish" msgstr "Шведски" -#: conf/global_settings.py:72 +#: conf/global_settings.py:85 msgid "Tamil" msgstr "Тамил" -#: conf/global_settings.py:73 +#: conf/global_settings.py:86 msgid "Telugu" msgstr "Телугу" -#: conf/global_settings.py:74 +#: conf/global_settings.py:87 msgid "Turkish" msgstr "Турски" -#: conf/global_settings.py:75 +#: conf/global_settings.py:88 msgid "Ukrainian" msgstr "Украински" -#: conf/global_settings.py:76 +#: conf/global_settings.py:89 msgid "Simplified Chinese" msgstr "Упростен кинески" -#: conf/global_settings.py:77 +#: conf/global_settings.py:90 msgid "Traditional Chinese" msgstr "Традиционален кинески" -#: core/validators.py:64 -msgid "This value must contain only letters, numbers and underscores." -msgstr "Оваа вредност смее да има само букви, бројки или долни црти." - -#: core/validators.py:68 -msgid "" -"This value must contain only letters, numbers, underscores, dashes or " -"slashes." -msgstr "Оваа вредност смее да има само букви, бројки, долни црти, црти или коси црти." - -#: core/validators.py:72 -msgid "This value must contain only letters, numbers, underscores or hyphens." -msgstr "Оваа вредност смее да содржи само букви, бројки, долни црти или црти." - -#: core/validators.py:76 -msgid "Uppercase letters are not allowed here." -msgstr "Големи букви не се дозволени." - -#: core/validators.py:80 -msgid "Lowercase letters are not allowed here." -msgstr "Мали букви не се дозволени." - -#: core/validators.py:87 -msgid "Enter only digits separated by commas." -msgstr "Внесете само цифри одделени со запирки." - -#: core/validators.py:99 -msgid "Enter valid e-mail addresses separated by commas." -msgstr "Внесете валидни адреси за е-пошта одделени со запирки." - -#: core/validators.py:103 -msgid "Please enter a valid IP address." -msgstr "Ве молам внесете валидна ИП адреса." - -#: core/validators.py:107 -msgid "Empty values are not allowed here." -msgstr "Празни вредности не се дозволени." - -#: core/validators.py:111 -msgid "Non-numeric characters aren't allowed here." -msgstr "Ненумерички знаци не се дозволени тука." - -#: core/validators.py:115 -msgid "This value can't be comprised solely of digits." -msgstr "Оваа вредност не смее да биде само од цифри." - -#: core/validators.py:120 newforms/fields.py:128 -msgid "Enter a whole number." -msgstr "Внеси цел број." - -#: core/validators.py:124 -msgid "Only alphabetical characters are allowed here." -msgstr "Дозволени се само букви." - -#: core/validators.py:139 -msgid "Year must be 1900 or later." -msgstr "Годината мора да биде 1900 или покасно." - -#: core/validators.py:143 -#, python-format -msgid "Invalid date: %s" -msgstr "Неправилен датум: %s" - -#: core/validators.py:153 -msgid "Enter a valid time in HH:MM format." -msgstr "Внесете правилно време во форматот HH:MM." - -#: core/validators.py:162 newforms/fields.py:271 -msgid "Enter a valid e-mail address." -msgstr "Внесeте правилна адреса за е-пошта." - -#: core/validators.py:174 core/validators.py:445 oldforms/__init__.py:672 -msgid "No file was submitted. Check the encoding type on the form." -msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата." - -#: core/validators.py:178 -msgid "" -"Upload a valid image. The file you uploaded was either not an image or a " -"corrupted image." -msgstr "" -"Качете валидна фотографија. Датотеката која ја качивте или не беше " -"фотографија или беше расипана датотеката." - -#: core/validators.py:185 -#, python-format -msgid "The URL %s does not point to a valid image." -msgstr "Адресата %s не покажува кон валидна фотографија." - -#: core/validators.py:189 -#, python-format -msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." -msgstr "" -"Телефонските броеви мора да бидат во XXX-XXX-XXXX форматот. „%s“ не е " -"валиден." - -#: core/validators.py:197 -#, python-format -msgid "The URL %s does not point to a valid QuickTime video." -msgstr "Адресата „%s“ не покажува кон QuickTime видео." - -#: core/validators.py:201 -msgid "A valid URL is required." -msgstr "Задолжителна е правилна адреса." - -#: core/validators.py:215 -#, python-format -msgid "" -"Valid HTML is required. Specific errors are:\n" -"%s" -msgstr "" -"Задолжителен е правилен HTML. Грешките се:\n" -"%s" - -#: core/validators.py:222 -#, python-format -msgid "Badly formed XML: %s" -msgstr "Неправилно формиран XML: %s" - -#: core/validators.py:239 -#, python-format -msgid "Invalid URL: %s" -msgstr "Неправилна адреса: %s" - -#: core/validators.py:244 core/validators.py:246 -#, python-format -msgid "The URL %s is a broken link." -msgstr "Адресата %s е скршена врска." - -#: core/validators.py:252 -msgid "Enter a valid U.S. state abbreviation." -msgstr "Внесете правилна скратеница за држава во САД." - -#: core/validators.py:266 -#, python-format -msgid "Watch your mouth! The word %s is not allowed here." -msgid_plural "Watch your mouth! The words %s are not allowed here." -msgstr[0] "Внимавајте на јазикот. Тука не е дозволен зборот %s." -msgstr[1] "Внимавајте на јазикот. Тука не се дозволени зборовите %s." - -#: core/validators.py:273 -#, python-format -msgid "This field must match the '%s' field." -msgstr "Ова поле мора да соодејствува со полето „%s“." - -#: core/validators.py:292 -msgid "Please enter something for at least one field." -msgstr "Ве молам внесете нешто во барем едно поле." - -#: core/validators.py:301 core/validators.py:312 -msgid "Please enter both fields or leave them both empty." -msgstr "Ве молам внесете во двете полиња или оставете ги двете празни." - -#: core/validators.py:320 -#, python-format -msgid "This field must be given if %(field)s is %(value)s" -msgstr "Ова поле мора да биде зададено ако %(field)s е %(value)s" - -#: core/validators.py:333 -#, python-format -msgid "This field must be given if %(field)s is not %(value)s" -msgstr "Ова поле мора да биде зададено ако %(field)s не е %(value)s" - -#: core/validators.py:352 -msgid "Duplicate values are not allowed." -msgstr "Дупликат вредности не се дозволени." - -#: core/validators.py:367 -#, python-format -msgid "This value must be between %(lower)s and %(upper)s." -msgstr "Оваа вредноста мора да биде помеѓу %(lower)s и %(upper)s." - -#: core/validators.py:369 -#, python-format -msgid "This value must be at least %s." -msgstr "Оваа вредноста мора да биде најмалку %s." - -#: core/validators.py:371 -#, python-format -msgid "This value must be no more than %s." -msgstr "Оваа вредност не смее да биде поголема од %s." - -#: core/validators.py:407 -#, python-format -msgid "This value must be a power of %s." -msgstr "Оваа вредноста мора да биде степен од %s." - -#: core/validators.py:418 -msgid "Please enter a valid decimal number." -msgstr "Ве молам внесете правилен децимален број." - -#: core/validators.py:422 -#, python-format -msgid "Please enter a valid decimal number with at most %s total digit." -msgid_plural "Please enter a valid decimal number with at most %s total digits." -msgstr[0] "Ве молам внесете правилен децимален број со најмногу %s цифрa." -msgstr[1] "Ве молам внесете правилен децимален број со најмногу %s вкупно цифри." - -#: core/validators.py:425 -#, python-format -msgid "Please enter a valid decimal number with a whole part of at most %s digit." -msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." -msgstr[0] "" -"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s " -"цифра." -msgstr[1] "" -"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s " -"цифри." - -#: core/validators.py:428 -#, python-format -msgid "Please enter a valid decimal number with at most %s decimal place." -msgid_plural "Please enter a valid decimal number with at most %s decimal places." -msgstr[0] "Ве молам внесете правилен децимален број кој има најмногу %s децимална цифра." -msgstr[1] "Ве молам внесете правилен децимален број кој има најмногу %s децимални цифри." - -#: core/validators.py:438 -#, python-format -msgid "Make sure your uploaded file is at least %s bytes big." -msgstr "Потврдете дека качената датотека има најмалку %s бајти." - -#: core/validators.py:439 -#, python-format -msgid "Make sure your uploaded file is at most %s bytes big." -msgstr "Потврдете дека качената датотека има најмногу %s бајти." - -#: core/validators.py:456 -msgid "The format for this field is wrong." -msgstr "Форматот за ова поле е грешен." - -#: core/validators.py:471 -msgid "This field is invalid." -msgstr "Ова поле не е правилно." - -#: core/validators.py:507 -#, python-format -msgid "Could not retrieve anything from %s." -msgstr "Неможев да извадам ништо од %s." - -#: core/validators.py:510 -#, python-format -msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." -msgstr "Адресата %(url)s врати неправилно заглавје Content-Type „%(contenttype)s“." - -#: core/validators.py:543 -#, python-format -msgid "" -"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " -"\"%(start)s\".)" -msgstr "" -"Ве молам затворете го отворениот %(tag)s таг од линијата %(line)s. (линијата " -"почнува со „%(start)s“.)" - -#: core/validators.py:547 -#, python-format -msgid "" -"Some text starting on line %(line)s is not allowed in that context. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Некој текст кој почнува на линијата %(line)s не е дозволен во тој контекст. " -"(Линијата започнува со „%(start)s“.)" - -#: core/validators.py:552 -#, python-format -msgid "" -"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"„%(attr)s“ на линија %(line)s е неправилен атрибут. (линијата започнува со „%" -"(start)s“.)" - -#: core/validators.py:557 -#, python-format -msgid "" -"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" -"(start)s\".)" -msgstr "" -"„<%(tag)s>“ на линија %(line)s е неправилен таг. (линијата започнува со „%" -"(start)s“.)" - -#: core/validators.py:561 -#, python-format -msgid "" -"A tag on line %(line)s is missing one or more required attributes. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"На таг од линијата %(line)s му недостасува еден или повеќе од потребните " -"атрибути (линијата започнува со „%(start)s“)." - -#: core/validators.py:566 -#, python-format -msgid "" -"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " -"starts with \"%(start)s\".)" -msgstr "" -"Атрибутот „%(attr)s“ на линијата %(line)s има неправилна вредност (линијата " -"започнува со „%(start)s“)." - -#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 -msgid "The two password fields didn't match." -msgstr "Двете полиња со лозинките не се совпаѓаат." - -#: contrib/auth/forms.py:25 -msgid "A user with that username already exists." -msgstr "Веќе постои корисник со тоа корисничко име." - -#: contrib/auth/forms.py:53 -msgid "" -"Your Web browser doesn't appear to have cookies enabled. Cookies are " -"required for logging in." -msgstr "" -"Не изгледа дека вашиот прелистувач има овозможено колачиња. Колачињата се " -"потребни за да се најавите." - -#: contrib/auth/forms.py:60 contrib/admin/views/decorators.py:10 -msgid "" -"Please enter a correct username and password. Note that both fields are case-" -"sensitive." -msgstr "" -"Ве молам внесете точно корисничко име и лозинка. Имајте на ум дека и во " -"двете полиња се битни големите и малите букви." - -#: contrib/auth/forms.py:62 -msgid "This account is inactive." -msgstr "Оваа сметка е неактивна." - -#: contrib/auth/forms.py:85 -msgid "" -"That e-mail address doesn't have an associated user account. Are you sure " -"you've registered?" -msgstr "" -"Нема регистрирано корисник со оваа адреса за е-пошта. Сигурни ли сте дека " -"сте регистрирани?" - -#: contrib/auth/forms.py:117 -msgid "The two 'new password' fields didn't match." -msgstr "Двете нови лозинки не се совпаѓаат." - -#: contrib/auth/forms.py:124 -msgid "Your old password was entered incorrectly. Please enter it again." -msgstr "Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно." - -#: contrib/auth/models.py:38 contrib/auth/models.py:58 -msgid "name" -msgstr "име" - -#: contrib/auth/models.py:40 -msgid "codename" -msgstr "кодно име" - -#: contrib/auth/models.py:43 -msgid "permission" -msgstr "привилегија" - -#: contrib/auth/models.py:44 contrib/auth/models.py:59 -msgid "permissions" -msgstr "привилегии" - -#: contrib/auth/models.py:62 -msgid "group" -msgstr "група" - -#: contrib/auth/models.py:63 contrib/auth/models.py:103 -msgid "groups" -msgstr "групи" - -#: contrib/auth/models.py:93 -msgid "username" -msgstr "корисничко име" - -#: contrib/auth/models.py:93 -msgid "" -"Required. 30 characters or fewer. Alphanumeric characters only (letters, " -"digits and underscores)." -msgstr "" -"Дозволени се најмногу 30 знаци. Дозволени се само алфанумерички знаци " -"(букви, цифри и долна црта)." - -#: contrib/auth/models.py:94 -msgid "first name" -msgstr "име" - -#: contrib/auth/models.py:95 -msgid "last name" -msgstr "презиме" - -#: contrib/auth/models.py:96 -msgid "e-mail address" -msgstr "е-пошта" - -#: contrib/auth/models.py:97 -msgid "password" -msgstr "лозинка" - -#: contrib/auth/models.py:97 -msgid "" -"Use '[algo]$[salt]$[hexdigest]' or use the change " -"password form." -msgstr "" -"Користете '[algo]$[salt]$[hexdigest]' или користете ја формата за промена на лозинката." - -#: contrib/auth/models.py:98 -msgid "staff status" -msgstr "статус на администраторите" - -#: contrib/auth/models.py:98 -msgid "Designates whether the user can log into this admin site." -msgstr "Означува дали корисникот може да се логира во сајтот за администрација." - -#: contrib/auth/models.py:99 -msgid "active" -msgstr "активен" - -#: contrib/auth/models.py:99 -msgid "" -"Designates whether this user can log into the Django admin. Unselect this " -"instead of deleting accounts." -msgstr "" -"Означува дали корисникот може да се логира. Одштиклирајте го ова наместо да " -"бришете корисници." - -#: contrib/auth/models.py:100 -msgid "superuser status" -msgstr "статус на суперкорисник" - -#: contrib/auth/models.py:100 -msgid "" -"Designates that this user has all permissions without explicitly assigning " -"them." -msgstr "" -"Означува дека овој корисник ги има сите привилегии без експлицитно да се " -"доделуваат сите." - -#: contrib/auth/models.py:101 -msgid "last login" -msgstr "последна најава" - -#: contrib/auth/models.py:102 -msgid "date joined" -msgstr "датум на зачленување" - -#: contrib/auth/models.py:104 -msgid "" -"In addition to the permissions manually assigned, this user will also get " -"all permissions granted to each group he/she is in." -msgstr "" -"Како дополнување на рачно доделени привилегии, овој корисник ќе ги добие " -"автоматски и сите привилегии за секоја група во која тој/таа членува." - -#: contrib/auth/models.py:105 -msgid "user permissions" -msgstr "кориснички привилегии" - -#: contrib/auth/models.py:109 -msgid "user" -msgstr "корисник" - -#: contrib/auth/models.py:110 -msgid "users" -msgstr "корисници" - -#: contrib/auth/models.py:116 -msgid "Personal info" -msgstr "Лични информации" - -#: contrib/auth/models.py:117 -msgid "Permissions" -msgstr "Привилегии" - -#: contrib/auth/models.py:118 -msgid "Important dates" -msgstr "Важни датуми" - -#: contrib/auth/models.py:119 -msgid "Groups" -msgstr "Групи" - -#: contrib/auth/models.py:263 -msgid "message" -msgstr "порака" - -#: contrib/auth/views.py:39 -msgid "Logged out" -msgstr "Одјавен" - -#: contrib/admin/models.py:16 -msgid "action time" -msgstr "време на акција" - -#: contrib/admin/models.py:19 -msgid "object id" -msgstr "идентификационен број на објект" - -#: contrib/admin/models.py:20 -msgid "object repr" -msgstr "object repr" - -#: contrib/admin/models.py:21 -msgid "action flag" -msgstr "знакче за акција" - -#: contrib/admin/models.py:22 -msgid "change message" -msgstr "измени ја пораката" - -#: contrib/admin/models.py:25 -msgid "log entry" -msgstr "ставка во записникот" - -#: contrib/admin/models.py:26 -msgid "log entries" -msgstr "ставки во записникот" - -#: contrib/admin/filterspecs.py:40 +#: contrib/admin/filterspecs.py:44 #, python-format msgid "" "

By %s:

\n" @@ -767,433 +212,73 @@ msgstr "" "

Од %s:

\n" "
    \n" -#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88 -#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169 +#: contrib/admin/filterspecs.py:74 contrib/admin/filterspecs.py:92 +#: contrib/admin/filterspecs.py:147 contrib/admin/filterspecs.py:173 msgid "All" msgstr "Сите" -#: contrib/admin/filterspecs.py:109 +#: contrib/admin/filterspecs.py:113 msgid "Any date" msgstr "Било кој датум" -#: contrib/admin/filterspecs.py:110 +#: contrib/admin/filterspecs.py:114 msgid "Today" msgstr "Денеска" -#: contrib/admin/filterspecs.py:113 +#: contrib/admin/filterspecs.py:117 msgid "Past 7 days" msgstr "Последните 7 дена" -#: contrib/admin/filterspecs.py:115 +#: contrib/admin/filterspecs.py:119 msgid "This month" msgstr "Овој месец" -#: contrib/admin/filterspecs.py:117 +#: contrib/admin/filterspecs.py:121 msgid "This year" msgstr "Оваа година" -#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:577 -#: newforms/widgets.py:174 +#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231 +#: oldforms/__init__.py:592 msgid "Yes" msgstr "Да" -#: contrib/admin/filterspecs.py:143 oldforms/__init__.py:577 -#: newforms/widgets.py:174 +#: contrib/admin/filterspecs.py:147 newforms/widgets.py:231 +#: oldforms/__init__.py:592 msgid "No" msgstr "Не" -#: contrib/admin/filterspecs.py:150 oldforms/__init__.py:577 -#: newforms/widgets.py:174 +#: contrib/admin/filterspecs.py:154 newforms/widgets.py:231 +#: oldforms/__init__.py:592 msgid "Unknown" msgstr "Непознато" -#: contrib/admin/views/decorators.py:24 -#: contrib/admin/templates/admin/login.html:25 -msgid "Log in" -msgstr "Најава" +#: contrib/admin/models.py:18 +msgid "action time" +msgstr "време на акција" -#: contrib/admin/views/decorators.py:62 -msgid "" -"Please log in again, because your session has expired. Don't worry: Your " -"submission has been saved." -msgstr "" -"Ве молам најавете се повторно бидејќи вашата сесија е истечена. Не се " -"грижете. Вашите внесови беа зачувани." +#: contrib/admin/models.py:21 +msgid "object id" +msgstr "идентификационен број на објект" -#: contrib/admin/views/decorators.py:69 -msgid "" -"Looks like your browser isn't configured to accept cookies. Please enable " -"cookies, reload this page, and try again." -msgstr "" -"Изгледа дека вашиот прелистувач не е конфигуриран да прифаќа колачиња. Ве " -"молам овозможете ги колачињата, превчитајте ја страта и пробајте повторно." +#: contrib/admin/models.py:22 +msgid "object repr" +msgstr "object repr" -#: contrib/admin/views/decorators.py:83 -msgid "Usernames cannot contain the '@' character." -msgstr "Корисничките имиња неможе да го содржат „@“ знакот." +#: contrib/admin/models.py:23 +msgid "action flag" +msgstr "знакче за акција" -#: contrib/admin/views/decorators.py:85 -#, python-format -msgid "Your e-mail address is not your username. Try '%s' instead." -msgstr "Вашата е-пошта не е вашето корисничко име. Пробајте со „%s“." +#: contrib/admin/models.py:24 +msgid "change message" +msgstr "измени ја пораката" -#: contrib/admin/views/main.py:223 -msgid "Site administration" -msgstr "Администрација на сајт" +#: contrib/admin/models.py:27 +msgid "log entry" +msgstr "ставка во записникот" -#: contrib/admin/views/main.py:257 contrib/admin/views/auth.py:19 -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." -msgstr "%(name)s \"%(obj)s\" беше успешно додаден." - -#: contrib/admin/views/main.py:261 contrib/admin/views/main.py:347 -#: contrib/admin/views/auth.py:24 -msgid "You may edit it again below." -msgstr "Подолу можете повторно да го уредите." - -#: contrib/admin/views/main.py:271 contrib/admin/views/main.py:356 -#, python-format -msgid "You may add another %s below." -msgstr "Подолу можете да додате уште еден %s." - -#: contrib/admin/views/main.py:289 -#, python-format -msgid "Add %s" -msgstr "Додади %s" - -#: contrib/admin/views/main.py:335 -#, python-format -msgid "Added %s." -msgstr "Додадено %s." - -#: contrib/admin/views/main.py:337 -#, python-format -msgid "Changed %s." -msgstr "Изменета %s." - -#: contrib/admin/views/main.py:339 -#, python-format -msgid "Deleted %s." -msgstr "Избришана %s." - -#: contrib/admin/views/main.py:342 -msgid "No fields changed." -msgstr "Не беше изменето ниедно поле." - -#: contrib/admin/views/main.py:345 -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "%(name)s \"%(obj)s\" беше успешно изменета." - -#: contrib/admin/views/main.py:353 -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." -msgstr "" -"%(name)s \"%(obj)s\" беше успешно додадена.Подолу можете повторно да ја " -"уредите." - -#: contrib/admin/views/main.py:391 -#, python-format -msgid "Change %s" -msgstr "Измени %s" - -#: contrib/admin/views/main.py:476 -#, python-format -msgid "One or more %(fieldname)s in %(name)s: %(obj)s" -msgstr "Еден или повеќе %(fieldname)s во %(name)s: %(obj)s" - -#: contrib/admin/views/main.py:481 -#, python-format -msgid "One or more %(fieldname)s in %(name)s:" -msgstr "Еден или повеќе %(fieldname)s во %(name)s:" - -#: contrib/admin/views/main.py:514 -#, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "%(name)s \"%(obj)s\" беше избришана успешно." - -#: contrib/admin/views/main.py:517 -msgid "Are you sure?" -msgstr "Сигурни сте?" - -#: contrib/admin/views/main.py:539 -#, python-format -msgid "Change history: %s" -msgstr "Историја на измени: %s" - -#: contrib/admin/views/main.py:573 -#, python-format -msgid "Select %s" -msgstr "Изберет %s" - -#: contrib/admin/views/main.py:573 -#, python-format -msgid "Select %s to change" -msgstr "Изберете %s за измена" - -#: contrib/admin/views/main.py:768 -msgid "Database error" -msgstr "Грешка во базата со податоци" - -#: contrib/admin/views/doc.py:46 contrib/admin/views/doc.py:48 -#: contrib/admin/views/doc.py:50 -msgid "tag:" -msgstr "таг:" - -#: contrib/admin/views/doc.py:77 contrib/admin/views/doc.py:79 -#: contrib/admin/views/doc.py:81 -msgid "filter:" -msgstr "филтер:" - -#: contrib/admin/views/doc.py:135 contrib/admin/views/doc.py:137 -#: contrib/admin/views/doc.py:139 -msgid "view:" -msgstr "поглед:" - -#: contrib/admin/views/doc.py:164 -#, python-format -msgid "App %r not found" -msgstr "Не е најдена апликацијата %r" - -#: contrib/admin/views/doc.py:171 -#, python-format -msgid "Model %(name)r not found in app %(label)r" -msgstr "Моделот %(name)r не е најден во апликацијата %(label)r" - -#: contrib/admin/views/doc.py:183 -#, python-format -msgid "the related `%(label)s.%(type)s` object" -msgstr "поврзаниот`%(label)s.%(type)s` објект" - -#: contrib/admin/views/doc.py:183 contrib/admin/views/doc.py:205 -#: contrib/admin/views/doc.py:219 contrib/admin/views/doc.py:224 -msgid "model:" -msgstr "модел:" - -#: contrib/admin/views/doc.py:214 -#, python-format -msgid "related `%(label)s.%(name)s` objects" -msgstr "поврзани `%(label)s.%(name)s` објекти" - -#: contrib/admin/views/doc.py:219 -#, python-format -msgid "all %s" -msgstr "сите %s" - -#: contrib/admin/views/doc.py:224 -#, python-format -msgid "number of %s" -msgstr "број на %s" - -#: contrib/admin/views/doc.py:229 -#, python-format -msgid "Fields on %s objects" -msgstr "Полиња на %s објекти" - -#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:301 -#: contrib/admin/views/doc.py:303 contrib/admin/views/doc.py:309 -#: contrib/admin/views/doc.py:310 contrib/admin/views/doc.py:312 -msgid "Integer" -msgstr "Цел број" - -#: contrib/admin/views/doc.py:292 -msgid "Boolean (Either True or False)" -msgstr "Логичка (или точно или неточно)" - -#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:311 -#, python-format -msgid "String (up to %(maxlength)s)" -msgstr "Збор (до %(maxlength)s)" - -#: contrib/admin/views/doc.py:294 -msgid "Comma-separated integers" -msgstr "Целобројни вредности одделени со запирка" - -#: contrib/admin/views/doc.py:295 -msgid "Date (without time)" -msgstr "Датум (без час)" - -#: contrib/admin/views/doc.py:296 -msgid "Date (with time)" -msgstr "Датум (со час)" - -#: contrib/admin/views/doc.py:297 -msgid "E-mail address" -msgstr "Адреса на е-пошта" - -#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:299 -#: contrib/admin/views/doc.py:302 -msgid "File path" -msgstr "Патека на датотека" - -#: contrib/admin/views/doc.py:300 -msgid "Decimal number" -msgstr "Децимален број" - -#: contrib/admin/views/doc.py:304 contrib/comments/models.py:85 -msgid "IP address" -msgstr "ИП адреса" - -#: contrib/admin/views/doc.py:306 -msgid "Boolean (Either True, False or None)" -msgstr "Логичка (точно,неточно или празно)" - -#: contrib/admin/views/doc.py:307 -msgid "Relation to parent model" -msgstr "Релација со родителскиот модел" - -#: contrib/admin/views/doc.py:308 -msgid "Phone number" -msgstr "Телефонски број" - -#: contrib/admin/views/doc.py:313 -msgid "Text" -msgstr "Текст" - -#: contrib/admin/views/doc.py:314 -msgid "Time" -msgstr "Час" - -#: contrib/admin/views/doc.py:315 contrib/flatpages/models.py:7 -msgid "URL" -msgstr "URL" - -#: contrib/admin/views/doc.py:316 -msgid "U.S. state (two uppercase letters)" -msgstr "Држава во САД (две големи букви)" - -#: contrib/admin/views/doc.py:317 -msgid "XML text" -msgstr "XML текст" - -#: contrib/admin/views/doc.py:343 -#, python-format -msgid "%s does not appear to be a urlpattern object" -msgstr "%s не изгледа дека е url објект" - -#: contrib/admin/views/auth.py:30 -msgid "Add user" -msgstr "Додади корисник" - -#: contrib/admin/views/auth.py:57 -msgid "Password changed successfully." -msgstr "Успешна промена на лозинката." - -#: contrib/admin/views/auth.py:64 -#, python-format -msgid "Change password: %s" -msgstr "Промени лозинка: %s" - -#: contrib/admin/templatetags/admin_list.py:247 -msgid "All dates" -msgstr "Сите датуми" - -#: contrib/admin/templates/admin/pagination.html:10 -msgid "Show all" -msgstr "Прикажи ги сите" - -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/base.html:25 -#: contrib/admin/templates/admin/auth/user/change_password.html:9 -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/registration/password_change_done.html:3 -msgid "Documentation" -msgstr "Документација" - -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/base.html:25 -#: contrib/admin/templates/admin/auth/user/change_password.html:9 -#: contrib/admin/templates/admin/auth/user/change_password.html:15 -#: contrib/admin/templates/admin/auth/user/change_password.html:46 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 -#: contrib/admin/templates/admin_doc/bookmarklets.html:4 -#: contrib/admin/templates/admin_doc/template_tag_index.html:5 -#: contrib/admin/templates/admin_doc/index.html:4 -#: contrib/admin/templates/admin_doc/model_detail.html:3 -#: contrib/admin/templates/admin_doc/missing_docutils.html:4 -#: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/view_index.html:5 -#: contrib/admin/templates/admin_doc/model_index.html:5 -#: contrib/admin/templates/admin_doc/view_detail.html:4 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/registration/password_change_done.html:3 -msgid "Change password" -msgstr "Промени лозинка" - -#: contrib/admin/templates/admin/delete_confirmation.html:3 -#: contrib/admin/templates/admin/change_form.html:10 -#: contrib/admin/templates/admin/change_list.html:5 -#: contrib/admin/templates/admin/object_history.html:3 -#: contrib/admin/templates/admin/base.html:25 -#: contrib/admin/templates/admin/auth/user/change_password.html:9 -#: contrib/admin/templates/admin_doc/template_filter_index.html:5 -#: contrib/admin/templates/admin_doc/bookmarklets.html:4 -#: contrib/admin/templates/admin_doc/template_tag_index.html:5 -#: contrib/admin/templates/admin_doc/index.html:4 -#: contrib/admin/templates/admin_doc/model_detail.html:3 -#: contrib/admin/templates/admin_doc/missing_docutils.html:4 -#: contrib/admin/templates/admin_doc/template_detail.html:4 -#: contrib/admin/templates/admin_doc/view_index.html:5 -#: contrib/admin/templates/admin_doc/model_index.html:5 -#: contrib/admin/templates/admin_doc/view_detail.html:4 -#: contrib/admin/templates/registration/password_change_form.html:3 -#: contrib/admin/templates/registration/password_change_done.html:3 -#: contrib/comments/templates/comments/form.html:6 -msgid "Log out" -msgstr "Одјава" - -#: contrib/admin/templates/admin/delete_confirmation.html:6 -#: contrib/admin/templates/admin/change_form.html:13 -#: contrib/admin/templates/admin/change_list.html:6 -#: contrib/admin/templates/admin/object_history.html:5 -#: contrib/admin/templates/admin/500.html:4 -#: contrib/admin/templates/admin/invalid_setup.html:4 -#: contrib/admin/templates/admin/base.html:30 -#: contrib/admin/templates/admin/auth/user/change_password.html:12 -#: contrib/admin/templates/admin_doc/bookmarklets.html:3 -#: contrib/admin/templates/registration/password_reset_form.html:4 -#: contrib/admin/templates/registration/logged_out.html:4 -#: contrib/admin/templates/registration/password_reset_done.html:4 -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_change_done.html:4 -msgid "Home" -msgstr "Дома" - -#: contrib/admin/templates/admin/delete_confirmation.html:9 -#: contrib/admin/templates/admin/submit_line.html:3 -msgid "Delete" -msgstr "Избриши" - -#: contrib/admin/templates/admin/delete_confirmation.html:14 -#, python-format -msgid "" -"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " -"related objects, but your account doesn't have permission to delete the " -"following types of objects:" -msgstr "" -"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " -"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги " -"бришете следните типови на објекти:" - -#: contrib/admin/templates/admin/delete_confirmation.html:21 -#, python-format -msgid "" -"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " -"All of the following related items will be deleted:" -msgstr "" -"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? " -"Сите овие ставки ќе бидат избришани:" - -#: contrib/admin/templates/admin/delete_confirmation.html:26 -msgid "Yes, I'm sure" -msgstr "Да, сигурен сум" +#: contrib/admin/models.py:28 +msgid "log entries" +msgstr "ставки во записникот" #: contrib/admin/templates/admin/404.html:4 #: contrib/admin/templates/admin/404.html:8 @@ -1204,60 +289,142 @@ msgstr "Страницата не е најдена" msgid "We're sorry, but the requested page could not be found." msgstr "Се извинуваме, но неможе да ја најдеме страницата која ја баравте." -#: contrib/admin/templates/admin/change_form.html:15 +#: contrib/admin/templates/admin/500.html:4 +#: contrib/admin/templates/admin/base.html:37 +#: contrib/admin/templates/admin/change_form.html:12 +#: contrib/admin/templates/admin/change_list.html:5 +#: contrib/admin/templates/admin/delete_confirmation.html:5 +#: contrib/admin/templates/admin/invalid_setup.html:4 +#: contrib/admin/templates/admin/object_history.html:4 +#: contrib/admin/templates/admin/auth/user/change_password.html:11 +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +#: contrib/admin/templates/registration/logged_out.html:4 +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:3 +#: contrib/admin/templates/registration/password_reset_done.html:4 +#: contrib/admin/templates/registration/password_reset_form.html:4 +msgid "Home" +msgstr "Дома" + +#: contrib/admin/templates/admin/500.html:4 +msgid "Server error" +msgstr "Грешка со серверот" + +#: contrib/admin/templates/admin/500.html:6 +msgid "Server error (500)" +msgstr "Грешка со серверот (500)" + +#: contrib/admin/templates/admin/500.html:9 +msgid "Server Error (500)" +msgstr "Грешка со серверот (500)" + +#: contrib/admin/templates/admin/500.html:10 +msgid "" +"There's been an error. It's been reported to the site administrators via e-" +"mail and should be fixed shortly. Thanks for your patience." +msgstr "" +"Имаше грешка. Истата беше пријавена на администраторите и ќе биде поправена " +"во брзо време. Ви благодариме за вашето трпение." + +#: contrib/admin/templates/admin/base.html:26 +msgid "Welcome," +msgstr "Добредојдовте," + +#: contrib/admin/templates/admin/base.html:28 +#: contrib/admin/templates/admin_doc/bookmarklets.html:3 +msgid "Documentation" +msgstr "Документација" + +#: contrib/admin/templates/admin/base.html:29 +#: contrib/admin/templates/admin/auth/user/change_password.html:14 +#: contrib/admin/templates/admin/auth/user/change_password.html:45 +msgid "Change password" +msgstr "Промени лозинка" + +#: contrib/admin/templates/admin/base.html:30 +#: contrib/comments/templates/comments/form.html:6 +msgid "Log out" +msgstr "Одјава" + +#: contrib/admin/templates/admin/base_site.html:4 +msgid "Django site admin" +msgstr "Џанго администрација на сајт" + +#: contrib/admin/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "Џанго администрација" + +#: contrib/admin/templates/admin/change_form.html:14 #: contrib/admin/templates/admin/index.html:28 msgid "Add" msgstr "Додади" -#: contrib/admin/templates/admin/change_form.html:21 -#: contrib/admin/templates/admin/object_history.html:5 +#: contrib/admin/templates/admin/change_form.html:20 +#: contrib/admin/templates/admin/object_history.html:4 msgid "History" msgstr "Историја" -#: contrib/admin/templates/admin/change_form.html:22 +#: contrib/admin/templates/admin/change_form.html:21 msgid "View on site" msgstr "Погледни на сајтот" -#: contrib/admin/templates/admin/change_form.html:32 -#: contrib/admin/templates/admin/auth/user/change_password.html:24 +#: contrib/admin/templates/admin/change_form.html:31 +#: contrib/admin/templates/admin/auth/user/change_password.html:23 msgid "Please correct the error below." msgid_plural "Please correct the errors below." msgstr[0] "Ве молам поправете ја грешката подолу." msgstr[1] "Ве молам поправете ги грешките подолу." -#: contrib/admin/templates/admin/change_form.html:50 +#: contrib/admin/templates/admin/change_form.html:49 msgid "Ordering" msgstr "Подредување" -#: contrib/admin/templates/admin/change_form.html:53 +#: contrib/admin/templates/admin/change_form.html:52 msgid "Order:" msgstr "Подреди:" +#: contrib/admin/templates/admin/change_list.html:11 +#, python-format +msgid "Add %(name)s" +msgstr "Додади %(name)s" + +#: contrib/admin/templates/admin/delete_confirmation.html:8 +#: contrib/admin/templates/admin/submit_line.html:3 +msgid "Delete" +msgstr "Избриши" + +#: contrib/admin/templates/admin/delete_confirmation.html:13 +#, python-format +msgid "" +"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting " +"related objects, but your account doesn't have permission to delete the " +"following types of objects:" +msgstr "" +"Бришење на %(object_name)s '%(escaped_object)s' ќе резултира со бришење на " +"поврзаните објекти, но со вашата сметка немате доволно привилегии да ги " +"бришете следните типови на објекти:" + +#: contrib/admin/templates/admin/delete_confirmation.html:20 +#, python-format +msgid "" +"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " +"All of the following related items will be deleted:" +msgstr "" +"Сигурне сте дека сакате да ги бришете %(object_name)s „%(escaped_object)s“? " +"Сите овие ставки ќе бидат избришани:" + +#: contrib/admin/templates/admin/delete_confirmation.html:25 +msgid "Yes, I'm sure" +msgstr "Да, сигурен сум" + #: contrib/admin/templates/admin/filter.html:2 #, python-format msgid " By %(filter_title)s " msgstr " Од %(filter_title)s " -#: contrib/admin/templates/admin/submit_line.html:4 -msgid "Save as new" -msgstr "Сними како нова" - -#: contrib/admin/templates/admin/submit_line.html:5 -msgid "Save and add another" -msgstr "Сними и додади уште" - -#: contrib/admin/templates/admin/submit_line.html:6 -msgid "Save and continue editing" -msgstr "Сними и продолжи со уредување" - -#: contrib/admin/templates/admin/submit_line.html:7 -msgid "Save" -msgstr "Сними" - -#: contrib/admin/templates/admin/change_list.html:12 -#, python-format -msgid "Add %(name)s" -msgstr "Додади %(name)s" +#: contrib/admin/templates/admin/filters.html:4 +msgid "Filter" +msgstr "Филтер" #: contrib/admin/templates/admin/index.html:17 #, python-format @@ -1289,58 +456,6 @@ msgstr "Мои акции" msgid "None available" msgstr "Ништо не е достапно" -#: contrib/admin/templates/admin/base_site.html:4 -msgid "Django site admin" -msgstr "Џанго администрација на сајт" - -#: contrib/admin/templates/admin/base_site.html:7 -msgid "Django administration" -msgstr "Џанго администрација" - -#: contrib/admin/templates/admin/object_history.html:18 -msgid "Date/time" -msgstr "Датум/час" - -#: contrib/admin/templates/admin/object_history.html:19 -msgid "User" -msgstr "Корисник" - -#: contrib/admin/templates/admin/object_history.html:20 -msgid "Action" -msgstr "Акција" - -#: contrib/admin/templates/admin/object_history.html:26 -msgid "DATE_WITH_TIME_FULL" -msgstr "j M Y, H:i" - -#: contrib/admin/templates/admin/object_history.html:36 -msgid "" -"This object doesn't have a change history. It probably wasn't added via this " -"admin site." -msgstr "" -"Овој објект нема историја на измени. Најверојатно не бил додаден со админ " -"сајтот." - -#: contrib/admin/templates/admin/500.html:4 -msgid "Server error" -msgstr "Грешка со серверот" - -#: contrib/admin/templates/admin/500.html:6 -msgid "Server error (500)" -msgstr "Грешка со серверот (500)" - -#: contrib/admin/templates/admin/500.html:9 -msgid "Server Error (500)" -msgstr "Грешка со серверот (500)" - -#: contrib/admin/templates/admin/500.html:10 -msgid "" -"There's been an error. It's been reported to the site administrators via e-" -"mail and should be fixed shortly. Thanks for your patience." -msgstr "" -"Имаше грешка. Истата беше пријавена на администраторите и ќе биде поправена " -"во брзо време. Ви благодариме за вашето трпение." - #: contrib/admin/templates/admin/invalid_setup.html:8 msgid "" "Something's wrong with your database installation. Make sure the appropriate " @@ -1351,6 +466,50 @@ msgstr "" "соодветни табели во базата се направени и потврдете дека базата може да биде " "прочитана од соодветниот корисник." +#: contrib/admin/templates/admin/login.html:17 +#: contrib/comments/templates/comments/form.html:6 +#: contrib/comments/templates/comments/form.html:8 +msgid "Username:" +msgstr "Корисник:" + +#: contrib/admin/templates/admin/login.html:20 +#: contrib/comments/templates/comments/form.html:8 +msgid "Password:" +msgstr "Лозинка:" + +#: contrib/admin/templates/admin/login.html:25 +#: contrib/admin/views/decorators.py:31 +msgid "Log in" +msgstr "Најава" + +#: contrib/admin/templates/admin/object_history.html:17 +msgid "Date/time" +msgstr "Датум/час" + +#: contrib/admin/templates/admin/object_history.html:18 +msgid "User" +msgstr "Корисник" + +#: contrib/admin/templates/admin/object_history.html:19 +msgid "Action" +msgstr "Акција" + +#: contrib/admin/templates/admin/object_history.html:25 +msgid "DATE_WITH_TIME_FULL" +msgstr "j M Y, H:i" + +#: contrib/admin/templates/admin/object_history.html:35 +msgid "" +"This object doesn't have a change history. It probably wasn't added via this " +"admin site." +msgstr "" +"Овој објект нема историја на измени. Најверојатно не бил додаден со админ " +"сајтот." + +#: contrib/admin/templates/admin/pagination.html:10 +msgid "Show all" +msgstr "Прикажи ги сите" + #: contrib/admin/templates/admin/search_form.html:8 msgid "Go" msgstr "Оди" @@ -1367,24 +526,21 @@ msgstr[1] "%(counter)s резултати" msgid "%(full_result_count)s total" msgstr "вкупно %(full_result_count)s" -#: contrib/admin/templates/admin/filters.html:4 -msgid "Filter" -msgstr "Филтер" +#: contrib/admin/templates/admin/submit_line.html:4 +msgid "Save as new" +msgstr "Сними како нова" -#: contrib/admin/templates/admin/login.html:17 -#: contrib/comments/templates/comments/form.html:6 -#: contrib/comments/templates/comments/form.html:8 -msgid "Username:" -msgstr "Корисник:" +#: contrib/admin/templates/admin/submit_line.html:5 +msgid "Save and add another" +msgstr "Сними и додади уште" -#: contrib/admin/templates/admin/login.html:20 -#: contrib/comments/templates/comments/form.html:8 -msgid "Password:" -msgstr "Лозинка:" +#: contrib/admin/templates/admin/submit_line.html:6 +msgid "Save and continue editing" +msgstr "Сними и продолжи со уредување" -#: contrib/admin/templates/admin/base.html:25 -msgid "Welcome," -msgstr "Добредојдовте," +#: contrib/admin/templates/admin/submit_line.html:7 +msgid "Save" +msgstr "Сними" #: contrib/admin/templates/admin/auth/user/add_form.html:6 msgid "" @@ -1399,21 +555,21 @@ msgid "Username" msgstr "Корисник" #: contrib/admin/templates/admin/auth/user/add_form.html:18 -#: contrib/admin/templates/admin/auth/user/change_password.html:34 +#: contrib/admin/templates/admin/auth/user/change_password.html:33 msgid "Password" msgstr "Лозинка" #: contrib/admin/templates/admin/auth/user/add_form.html:23 -#: contrib/admin/templates/admin/auth/user/change_password.html:39 +#: contrib/admin/templates/admin/auth/user/change_password.html:38 msgid "Password (again)" msgstr "Лозинка (повторно)" #: contrib/admin/templates/admin/auth/user/add_form.html:24 -#: contrib/admin/templates/admin/auth/user/change_password.html:40 +#: contrib/admin/templates/admin/auth/user/change_password.html:39 msgid "Enter the same password as above, for verification." msgstr "Заради верификација внесете ја истата лозинка како и горе." -#: contrib/admin/templates/admin/auth/user/change_password.html:28 +#: contrib/admin/templates/admin/auth/user/change_password.html:27 #, python-format msgid "Enter a new password for the user %(username)s." msgstr "Внесете нова лозинка за корисникот %(username)s." @@ -1422,11 +578,11 @@ msgstr "Внесете нова лозинка за корисникот To install bookmarklets, drag the link to your bookmarks\n" @@ -1447,11 +603,11 @@ msgstr "" "сајтот од компјутер кој е означен како „внатрешен“ (разговарајте со вашиот \n" "администратор ако не сте сигурни).

    \n" -#: contrib/admin/templates/admin_doc/bookmarklets.html:19 +#: contrib/admin/templates/admin_doc/bookmarklets.html:18 msgid "Documentation for this page" msgstr "Документација за оваа страница" -#: contrib/admin/templates/admin_doc/bookmarklets.html:20 +#: contrib/admin/templates/admin_doc/bookmarklets.html:19 msgid "" "Jumps you from any page to the documentation for the view that generates " "that page." @@ -1459,11 +615,11 @@ msgstr "" "Ве носи од било која страница од документацијата до погледот кој ја генерира " "таа страница." -#: contrib/admin/templates/admin_doc/bookmarklets.html:22 +#: contrib/admin/templates/admin_doc/bookmarklets.html:21 msgid "Show object ID" msgstr "Прикажи идентификационен број на објектот" -#: contrib/admin/templates/admin_doc/bookmarklets.html:23 +#: contrib/admin/templates/admin_doc/bookmarklets.html:22 msgid "" "Shows the content-type and unique ID for pages that represent a single " "object." @@ -1471,60 +627,89 @@ msgstr "" "Го прикажува типот на содржината и уникатниот идентификационен број за " "страници кои претставуваат единечен објект." -#: contrib/admin/templates/admin_doc/bookmarklets.html:25 +#: contrib/admin/templates/admin_doc/bookmarklets.html:24 msgid "Edit this object (current window)" msgstr "Уреди го овој објект (во овој прозорец)" -#: contrib/admin/templates/admin_doc/bookmarklets.html:26 +#: contrib/admin/templates/admin_doc/bookmarklets.html:25 msgid "Jumps to the admin page for pages that represent a single object." msgstr "Скокнува до админ страницата за страници кои претставуваат единечен објект." -#: contrib/admin/templates/admin_doc/bookmarklets.html:28 +#: contrib/admin/templates/admin_doc/bookmarklets.html:27 msgid "Edit this object (new window)" msgstr "Уреди го овој објект (во нов прозорец)" -#: contrib/admin/templates/admin_doc/bookmarklets.html:29 +#: contrib/admin/templates/admin_doc/bookmarklets.html:28 msgid "As above, but opens the admin page in a new window." msgstr "Како погоре, но ја отвара админ страницата во нов прозорец." -#: contrib/admin/templates/widget/date_time.html:3 -msgid "Date:" -msgstr "Датум:" +#: contrib/admin/templates/registration/logged_out.html:8 +msgid "Thanks for spending some quality time with the Web site today." +msgstr "Ви благодариме што денеска поминавте квалитетно време со интернет страницава." -#: contrib/admin/templates/widget/date_time.html:4 -msgid "Time:" -msgstr "Време:" +#: contrib/admin/templates/registration/logged_out.html:10 +msgid "Log in again" +msgstr "Логирајте се повторно" -#: contrib/admin/templates/widget/file.html:2 -msgid "Currently:" -msgstr "Моментално:" +#: contrib/admin/templates/registration/password_change_done.html:3 +#: contrib/admin/templates/registration/password_change_form.html:3 +#: contrib/admin/templates/registration/password_change_form.html:5 +#: contrib/admin/templates/registration/password_change_form.html:9 +msgid "Password change" +msgstr "Измена на лозинка" -#: contrib/admin/templates/widget/file.html:3 -msgid "Change:" -msgstr "Измена:" +#: contrib/admin/templates/registration/password_change_done.html:5 +#: contrib/admin/templates/registration/password_change_done.html:9 +msgid "Password change successful" +msgstr "Успешна промена на лозинката" +#: contrib/admin/templates/registration/password_change_done.html:11 +msgid "Your password was changed." +msgstr "Вашата лозинка беше сменета." + +#: contrib/admin/templates/registration/password_change_form.html:11 +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" +"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја " +"новата двапати за да може да се потврди дека правилно сте ја искуцале." + +#: contrib/admin/templates/registration/password_change_form.html:16 +msgid "Old password:" +msgstr "Стара лозинка:" + +#: contrib/admin/templates/registration/password_change_form.html:18 +msgid "New password:" +msgstr "Нова лозинка:" + +#: contrib/admin/templates/registration/password_change_form.html:20 +msgid "Confirm password:" +msgstr "Потврди лозинка:" + +#: contrib/admin/templates/registration/password_change_form.html:22 +msgid "Change my password" +msgstr "Промени ја мојата лозинка" + +#: contrib/admin/templates/registration/password_reset_done.html:4 #: contrib/admin/templates/registration/password_reset_form.html:4 #: contrib/admin/templates/registration/password_reset_form.html:6 #: contrib/admin/templates/registration/password_reset_form.html:10 -#: contrib/admin/templates/registration/password_reset_done.html:4 msgid "Password reset" msgstr "Ресетирање на лозинка" -#: contrib/admin/templates/registration/password_reset_form.html:12 +#: contrib/admin/templates/registration/password_reset_done.html:6 +#: contrib/admin/templates/registration/password_reset_done.html:10 +msgid "Password reset successful" +msgstr "Успешно е ресетирањето на лозинката" + +#: contrib/admin/templates/registration/password_reset_done.html:12 msgid "" -"Forgotten your password? Enter your e-mail address below, and we'll reset " -"your password and e-mail the new one to you." +"We've e-mailed a new password to the e-mail address you submitted. You " +"should be receiving it shortly." msgstr "" -"Сте ја заборавиле вашата лозинка? Внесете ја вашата е-пошта подолу, ќе ја " -"ресетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта." - -#: contrib/admin/templates/registration/password_reset_form.html:16 -msgid "E-mail address:" -msgstr "Е-пошта:" - -#: contrib/admin/templates/registration/password_reset_form.html:16 -msgid "Reset my password" -msgstr "Ресетирај ја мојата лозинка" +"Ви пративме нова лозинка на адресата која ја внесовте.Треба да ја примите за " +"кратко време." #: contrib/admin/templates/registration/password_reset_email.html:2 msgid "You're receiving this e-mail because you requested a password reset" @@ -1557,298 +742,579 @@ msgstr "Ви благодариме што го користите овој са msgid "The %(site_name)s team" msgstr "Тимот на %(site_name)s" -#: contrib/admin/templates/registration/logged_out.html:8 -msgid "Thanks for spending some quality time with the Web site today." -msgstr "Ви благодариме што денеска поминавте квалитетно време со интернет страницава." - -#: contrib/admin/templates/registration/logged_out.html:10 -msgid "Log in again" -msgstr "Логирајте се повторно" - -#: contrib/admin/templates/registration/password_reset_done.html:6 -#: contrib/admin/templates/registration/password_reset_done.html:10 -msgid "Password reset successful" -msgstr "Успешно е ресетирањето на лозинката" - -#: contrib/admin/templates/registration/password_reset_done.html:12 +#: contrib/admin/templates/registration/password_reset_form.html:12 msgid "" -"We've e-mailed a new password to the e-mail address you submitted. You " -"should be receiving it shortly." +"Forgotten your password? Enter your e-mail address below, and we'll reset " +"your password and e-mail the new one to you." msgstr "" -"Ви пративме нова лозинка на адресата која ја внесовте.Треба да ја примите за " -"кратко време." +"Сте ја заборавиле вашата лозинка? Внесете ја вашата е-пошта подолу, ќе ја " +"ресетираме вашата лозинка и новата ќе ви ја пратиме по е-пошта." -#: contrib/admin/templates/registration/password_change_form.html:4 -#: contrib/admin/templates/registration/password_change_form.html:6 -#: contrib/admin/templates/registration/password_change_form.html:10 -#: contrib/admin/templates/registration/password_change_done.html:4 -msgid "Password change" -msgstr "Измена на лозинка" +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "E-mail address:" +msgstr "Е-пошта:" -#: contrib/admin/templates/registration/password_change_form.html:12 -msgid "" -"Please enter your old password, for security's sake, and then enter your new " -"password twice so we can verify you typed it in correctly." -msgstr "" -"Заради сигурност ве молам внесете ја вашата стара лозинка и потоа внесете ја " -"новата двапати за да може да се потврди дека правилно сте ја искуцале." +#: contrib/admin/templates/registration/password_reset_form.html:16 +msgid "Reset my password" +msgstr "Ресетирај ја мојата лозинка" -#: contrib/admin/templates/registration/password_change_form.html:17 -msgid "Old password:" -msgstr "Стара лозинка:" +#: contrib/admin/templates/widget/date_time.html:3 +msgid "Date:" +msgstr "Датум:" -#: contrib/admin/templates/registration/password_change_form.html:19 -msgid "New password:" -msgstr "Нова лозинка:" +#: contrib/admin/templates/widget/date_time.html:4 +msgid "Time:" +msgstr "Време:" -#: contrib/admin/templates/registration/password_change_form.html:21 -msgid "Confirm password:" -msgstr "Потврди лозинка:" +#: contrib/admin/templates/widget/file.html:2 +msgid "Currently:" +msgstr "Моментално:" -#: contrib/admin/templates/registration/password_change_form.html:23 -msgid "Change my password" -msgstr "Промени ја мојата лозинка" +#: contrib/admin/templates/widget/file.html:3 +msgid "Change:" +msgstr "Измена:" -#: contrib/admin/templates/registration/password_change_done.html:6 -#: contrib/admin/templates/registration/password_change_done.html:10 -msgid "Password change successful" -msgstr "Успешна промена на лозинката" +#: contrib/admin/templatetags/admin_list.py:257 +msgid "All dates" +msgstr "Сите датуми" -#: contrib/admin/templates/registration/password_change_done.html:12 -msgid "Your password was changed." -msgstr "Вашата лозинка беше сменета." - -#: contrib/sites/models.py:10 -msgid "domain name" -msgstr "домејн" - -#: contrib/sites/models.py:11 -msgid "display name" -msgstr "име кое се прикажува" - -#: contrib/sites/models.py:15 -msgid "site" -msgstr "сајт" - -#: contrib/sites/models.py:16 -msgid "sites" -msgstr "сајтови" - -#: contrib/humanize/templatetags/humanize.py:17 -msgid "th" -msgstr "th" - -#: contrib/humanize/templatetags/humanize.py:17 -msgid "st" -msgstr "st" - -#: contrib/humanize/templatetags/humanize.py:17 -msgid "nd" -msgstr "nd" - -#: contrib/humanize/templatetags/humanize.py:17 -msgid "rd" -msgstr "rd" - -#: contrib/humanize/templatetags/humanize.py:47 +#: contrib/admin/views/auth.py:20 contrib/admin/views/main.py:267 #, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f милион" -msgstr[1] "%(value).1f милион" +msgid "The %(name)s \"%(obj)s\" was added successfully." +msgstr "%(name)s \"%(obj)s\" беше успешно додаден." -#: contrib/humanize/templatetags/humanize.py:50 +#: contrib/admin/views/auth.py:25 contrib/admin/views/main.py:271 +#: contrib/admin/views/main.py:356 +msgid "You may edit it again below." +msgstr "Подолу можете повторно да го уредите." + +#: contrib/admin/views/auth.py:31 +msgid "Add user" +msgstr "Додади корисник" + +#: contrib/admin/views/auth.py:58 +msgid "Password changed successfully." +msgstr "Успешна промена на лозинката." + +#: contrib/admin/views/auth.py:65 #, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f милијарда" -msgstr[1] "%(value).1f милијарда" +msgid "Change password: %s" +msgstr "Промени лозинка: %s" -#: contrib/humanize/templatetags/humanize.py:53 +#: contrib/admin/views/decorators.py:17 contrib/auth/forms.py:60 +msgid "" +"Please enter a correct username and password. Note that both fields are case-" +"sensitive." +msgstr "" +"Ве молам внесете точно корисничко име и лозинка. Имајте на ум дека и во " +"двете полиња се битни големите и малите букви." + +#: contrib/admin/views/decorators.py:69 +msgid "" +"Please log in again, because your session has expired. Don't worry: Your " +"submission has been saved." +msgstr "" +"Ве молам најавете се повторно бидејќи вашата сесија е истечена. Не се " +"грижете. Вашите внесови беа зачувани." + +#: contrib/admin/views/decorators.py:76 +msgid "" +"Looks like your browser isn't configured to accept cookies. Please enable " +"cookies, reload this page, and try again." +msgstr "" +"Изгледа дека вашиот прелистувач не е конфигуриран да прифаќа колачиња. Ве " +"молам овозможете ги колачињата, превчитајте ја страта и пробајте повторно." + +#: contrib/admin/views/decorators.py:89 #, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f трилион" -msgstr[1] "%(value).1f трилион" +msgid "Your e-mail address is not your username. Try '%s' instead." +msgstr "Вашата е-пошта не е вашето корисничко име. Пробајте со „%s“." -#: contrib/humanize/templatetags/humanize.py:68 -msgid "one" -msgstr "еден" +#: contrib/admin/views/decorators.py:93 +msgid "Usernames cannot contain the '@' character." +msgstr "Корисничките имиња неможе да го содржат „@“ знакот." -#: contrib/humanize/templatetags/humanize.py:68 -msgid "two" -msgstr "два" +#: contrib/admin/views/doc.py:48 contrib/admin/views/doc.py:50 +#: contrib/admin/views/doc.py:52 +msgid "tag:" +msgstr "таг:" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "three" -msgstr "три" +#: contrib/admin/views/doc.py:79 contrib/admin/views/doc.py:81 +#: contrib/admin/views/doc.py:83 +msgid "filter:" +msgstr "филтер:" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "four" -msgstr "четири" +#: contrib/admin/views/doc.py:137 contrib/admin/views/doc.py:139 +#: contrib/admin/views/doc.py:141 +msgid "view:" +msgstr "поглед:" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "five" -msgstr "пет" +#: contrib/admin/views/doc.py:166 +#, python-format +msgid "App %r not found" +msgstr "Не е најдена апликацијата %r" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "six" -msgstr "шест" +#: contrib/admin/views/doc.py:173 +#, python-format +msgid "Model %(name)r not found in app %(label)r" +msgstr "Моделот %(name)r не е најден во апликацијата %(label)r" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "seven" -msgstr "седум" +#: contrib/admin/views/doc.py:185 +#, python-format +msgid "the related `%(label)s.%(type)s` object" +msgstr "поврзаниот`%(label)s.%(type)s` објект" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "eight" -msgstr "осум" +#: contrib/admin/views/doc.py:185 contrib/admin/views/doc.py:207 +#: contrib/admin/views/doc.py:221 contrib/admin/views/doc.py:226 +msgid "model:" +msgstr "модел:" -#: contrib/humanize/templatetags/humanize.py:68 -msgid "nine" -msgstr "девет" +#: contrib/admin/views/doc.py:216 +#, python-format +msgid "related `%(label)s.%(name)s` objects" +msgstr "поврзани `%(label)s.%(name)s` објекти" -#: contrib/flatpages/models.py:8 -msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +#: contrib/admin/views/doc.py:221 +#, python-format +msgid "all %s" +msgstr "сите %s" + +#: contrib/admin/views/doc.py:226 +#, python-format +msgid "number of %s" +msgstr "број на %s" + +#: contrib/admin/views/doc.py:231 +#, python-format +msgid "Fields on %s objects" +msgstr "Полиња на %s објекти" + +#: contrib/admin/views/doc.py:293 contrib/admin/views/doc.py:304 +#: contrib/admin/views/doc.py:306 contrib/admin/views/doc.py:312 +#: contrib/admin/views/doc.py:313 contrib/admin/views/doc.py:315 +msgid "Integer" +msgstr "Цел број" + +#: contrib/admin/views/doc.py:294 +msgid "Boolean (Either True or False)" +msgstr "Логичка (или точно или неточно)" + +#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:314 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Збор (до %(max_length)s)" + +#: contrib/admin/views/doc.py:296 +msgid "Comma-separated integers" +msgstr "Целобројни вредности одделени со запирка" + +#: contrib/admin/views/doc.py:297 +msgid "Date (without time)" +msgstr "Датум (без час)" + +#: contrib/admin/views/doc.py:298 +msgid "Date (with time)" +msgstr "Датум (со час)" + +#: contrib/admin/views/doc.py:299 +msgid "Decimal number" +msgstr "Децимален број" + +#: contrib/admin/views/doc.py:300 +msgid "E-mail address" +msgstr "Адреса на е-пошта" + +#: contrib/admin/views/doc.py:301 contrib/admin/views/doc.py:302 +#: contrib/admin/views/doc.py:305 +msgid "File path" +msgstr "Патека на датотека" + +#: contrib/admin/views/doc.py:303 +msgid "Floating point number" +msgstr "Децимален број" + +#: contrib/admin/views/doc.py:307 contrib/comments/models.py:89 +msgid "IP address" +msgstr "ИП адреса" + +#: contrib/admin/views/doc.py:309 +msgid "Boolean (Either True, False or None)" +msgstr "Логичка (точно,неточно или празно)" + +#: contrib/admin/views/doc.py:310 +msgid "Relation to parent model" +msgstr "Релација со родителскиот модел" + +#: contrib/admin/views/doc.py:311 +msgid "Phone number" +msgstr "Телефонски број" + +#: contrib/admin/views/doc.py:316 +msgid "Text" +msgstr "Текст" + +#: contrib/admin/views/doc.py:317 +msgid "Time" +msgstr "Час" + +#: contrib/admin/views/doc.py:318 contrib/flatpages/models.py:8 +msgid "URL" +msgstr "URL" + +#: contrib/admin/views/doc.py:319 +msgid "U.S. state (two uppercase letters)" +msgstr "Држава во САД (две големи букви)" + +#: contrib/admin/views/doc.py:320 +msgid "XML text" +msgstr "XML текст" + +#: contrib/admin/views/doc.py:346 +#, python-format +msgid "%s does not appear to be a urlpattern object" +msgstr "%s не изгледа дека е url објект" + +#: contrib/admin/views/main.py:233 +msgid "Site administration" +msgstr "Администрација на сајт" + +#: contrib/admin/views/main.py:280 contrib/admin/views/main.py:365 +#, python-format +msgid "You may add another %s below." +msgstr "Подолу можете да додате уште еден %s." + +#: contrib/admin/views/main.py:298 +#, python-format +msgid "Add %s" +msgstr "Додади %s" + +#: contrib/admin/views/main.py:344 +#, python-format +msgid "Added %s." +msgstr "Додадено %s." + +#: contrib/admin/views/main.py:344 contrib/admin/views/main.py:346 +#: contrib/admin/views/main.py:348 core/validators.py:283 +#: db/models/manipulators.py:309 +msgid "and" +msgstr "и" + +#: contrib/admin/views/main.py:346 +#, python-format +msgid "Changed %s." +msgstr "Изменета %s." + +#: contrib/admin/views/main.py:348 +#, python-format +msgid "Deleted %s." +msgstr "Избришана %s." + +#: contrib/admin/views/main.py:351 +msgid "No fields changed." +msgstr "Не беше изменето ниедно поле." + +#: contrib/admin/views/main.py:354 +#, python-format +msgid "The %(name)s \"%(obj)s\" was changed successfully." +msgstr "%(name)s \"%(obj)s\" беше успешно изменета." + +#: contrib/admin/views/main.py:362 +#, python-format +msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." msgstr "" -"На пр. „/za/kontakt/“. Осигурајте се да имате коса црта и на крајот и на " -"почетокот." +"%(name)s \"%(obj)s\" беше успешно додадена.Подолу можете повторно да ја " +"уредите." -#: contrib/flatpages/models.py:9 -msgid "title" -msgstr "наслов" +#: contrib/admin/views/main.py:400 +#, python-format +msgid "Change %s" +msgstr "Измени %s" -#: contrib/flatpages/models.py:10 -msgid "content" -msgstr "содржина" +#: contrib/admin/views/main.py:487 +#, python-format +msgid "One or more %(fieldname)s in %(name)s: %(obj)s" +msgstr "Еден или повеќе %(fieldname)s во %(name)s: %(obj)s" -#: contrib/flatpages/models.py:11 -msgid "enable comments" -msgstr "овозможи коментари" +#: contrib/admin/views/main.py:492 +#, python-format +msgid "One or more %(fieldname)s in %(name)s:" +msgstr "Еден или повеќе %(fieldname)s во %(name)s:" -#: contrib/flatpages/models.py:12 -msgid "template name" -msgstr "име на шаблонот" +#: contrib/admin/views/main.py:524 +#, python-format +msgid "The %(name)s \"%(obj)s\" was deleted successfully." +msgstr "%(name)s \"%(obj)s\" беше избришана успешно." -#: contrib/flatpages/models.py:13 +#: contrib/admin/views/main.py:527 +msgid "Are you sure?" +msgstr "Сигурни сте?" + +#: contrib/admin/views/main.py:549 +#, python-format +msgid "Change history: %s" +msgstr "Историја на измени: %s" + +#: contrib/admin/views/main.py:583 +#, python-format +msgid "Select %s" +msgstr "Изберет %s" + +#: contrib/admin/views/main.py:583 +#, python-format +msgid "Select %s to change" +msgstr "Изберете %s за измена" + +#: contrib/admin/views/main.py:765 +msgid "Database error" +msgstr "Грешка во базата со податоци" + +#: contrib/auth/forms.py:17 contrib/auth/forms.py:138 +msgid "The two password fields didn't match." +msgstr "Двете полиња со лозинките не се совпаѓаат." + +#: contrib/auth/forms.py:25 +msgid "A user with that username already exists." +msgstr "Веќе постои корисник со тоа корисничко име." + +#: contrib/auth/forms.py:53 msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." +"Your Web browser doesn't appear to have cookies enabled. Cookies are " +"required for logging in." msgstr "" -"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи " -"„flatpages/default.html“." +"Не изгледа дека вашиот прелистувач има овозможено колачиња. Колачињата се " +"потребни за да се најавите." -#: contrib/flatpages/models.py:14 -msgid "registration required" -msgstr "потребна е регистрација" +#: contrib/auth/forms.py:62 +msgid "This account is inactive." +msgstr "Оваа сметка е неактивна." -#: contrib/flatpages/models.py:14 -msgid "If this is checked, only logged-in users will be able to view the page." -msgstr "" -"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа " -"страница." - -#: contrib/flatpages/models.py:18 -msgid "flat page" -msgstr "статична страница" - -#: contrib/flatpages/models.py:19 -msgid "flat pages" -msgstr "статични страници" - -#: contrib/redirects/models.py:7 -msgid "redirect from" -msgstr "пренасочено од" - -#: contrib/redirects/models.py:8 +#: contrib/auth/forms.py:84 msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." +"That e-mail address doesn't have an associated user account. Are you sure " +"you've registered?" msgstr "" -"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/" -"prebaraj/“." +"Нема регистрирано корисник со оваа адреса за е-пошта. Сигурни ли сте дека " +"сте регистрирани?" -#: contrib/redirects/models.py:9 -msgid "redirect to" -msgstr "пренасочи кон" +#: contrib/auth/forms.py:107 +#, python-format +msgid "Password reset on %s" +msgstr "Ресетирање на лозинка на %s" -#: contrib/redirects/models.py:10 +#: contrib/auth/forms.py:117 +msgid "The two 'new password' fields didn't match." +msgstr "Двете нови лозинки не се совпаѓаат." + +#: contrib/auth/forms.py:124 +msgid "Your old password was entered incorrectly. Please enter it again." +msgstr "Не ја внесовте точно вашата стара лозинка. Ве молам внесете ја повторно." + +#: contrib/auth/models.py:73 contrib/auth/models.py:93 +msgid "name" +msgstr "име" + +#: contrib/auth/models.py:75 +msgid "codename" +msgstr "кодно име" + +#: contrib/auth/models.py:78 +msgid "permission" +msgstr "привилегија" + +#: contrib/auth/models.py:79 contrib/auth/models.py:94 +msgid "permissions" +msgstr "привилегии" + +#: contrib/auth/models.py:97 +msgid "group" +msgstr "група" + +#: contrib/auth/models.py:98 contrib/auth/models.py:148 +msgid "groups" +msgstr "групи" + +#: contrib/auth/models.py:138 +msgid "username" +msgstr "корисничко име" + +#: contrib/auth/models.py:138 msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +"Required. 30 characters or fewer. Alphanumeric characters only (letters, " +"digits and underscores)." msgstr "" -"Ова може да биде или апсолутна патека (како погоре) или цела адреса " -"почувајќи со „http://“." +"Дозволени се најмногу 30 знаци. Дозволени се само алфанумерички знаци " +"(букви, цифри и долна црта)." -#: contrib/redirects/models.py:13 -msgid "redirect" -msgstr "пренасочување" +#: contrib/auth/models.py:139 +msgid "first name" +msgstr "име" -#: contrib/redirects/models.py:14 -msgid "redirects" -msgstr "пренасочувања" +#: contrib/auth/models.py:140 +msgid "last name" +msgstr "презиме" -#: contrib/comments/models.py:67 contrib/comments/models.py:166 +#: contrib/auth/models.py:141 +msgid "e-mail address" +msgstr "е-пошта" + +#: contrib/auth/models.py:142 +msgid "password" +msgstr "лозинка" + +#: contrib/auth/models.py:142 +msgid "" +"Use '[algo]$[salt]$[hexdigest]' or use the change " +"password form." +msgstr "" +"Користете '[algo]$[salt]$[hexdigest]' или користете ја формата за промена на лозинката." + +#: contrib/auth/models.py:143 +msgid "staff status" +msgstr "статус на администраторите" + +#: contrib/auth/models.py:143 +msgid "Designates whether the user can log into this admin site." +msgstr "Означува дали корисникот може да се логира во сајтот за администрација." + +#: contrib/auth/models.py:144 +msgid "active" +msgstr "активен" + +#: contrib/auth/models.py:144 +msgid "" +"Designates whether this user should be treated as active. Unselect this " +"instead of deleting accounts." +msgstr "" +"Означува дали корисникот треба да биде активен. Одштиклирајте го ова наместо да " +"бришете корисници." + +#: contrib/auth/models.py:145 +msgid "superuser status" +msgstr "статус на суперкорисник" + +#: contrib/auth/models.py:145 +msgid "" +"Designates that this user has all permissions without explicitly assigning " +"them." +msgstr "" +"Означува дека овој корисник ги има сите привилегии без експлицитно да се " +"доделуваат сите." + +#: contrib/auth/models.py:146 +msgid "last login" +msgstr "последна најава" + +#: contrib/auth/models.py:147 +msgid "date joined" +msgstr "датум на зачленување" + +#: contrib/auth/models.py:149 +msgid "" +"In addition to the permissions manually assigned, this user will also get " +"all permissions granted to each group he/she is in." +msgstr "" +"Како дополнување на рачно доделени привилегии, овој корисник ќе ги добие " +"автоматски и сите привилегии за секоја група во која тој/таа членува." + +#: contrib/auth/models.py:150 +msgid "user permissions" +msgstr "кориснички привилегии" + +#: contrib/auth/models.py:154 +msgid "user" +msgstr "корисник" + +#: contrib/auth/models.py:155 +msgid "users" +msgstr "корисници" + +#: contrib/auth/models.py:161 +msgid "Personal info" +msgstr "Лични информации" + +#: contrib/auth/models.py:162 +msgid "Permissions" +msgstr "Привилегии" + +#: contrib/auth/models.py:163 +msgid "Important dates" +msgstr "Важни датуми" + +#: contrib/auth/models.py:164 +msgid "Groups" +msgstr "Групи" + +#: contrib/auth/models.py:323 +msgid "message" +msgstr "порака" + +#: contrib/auth/views.py:47 +msgid "Logged out" +msgstr "Одјавен" + +#: contrib/comments/models.py:71 contrib/comments/models.py:176 msgid "object ID" msgstr "object ID" -#: contrib/comments/models.py:68 +#: contrib/comments/models.py:72 msgid "headline" msgstr "наслов" -#: contrib/comments/models.py:69 contrib/comments/models.py:90 -#: contrib/comments/models.py:167 +#: contrib/comments/models.py:73 contrib/comments/models.py:95 +#: contrib/comments/models.py:177 msgid "comment" msgstr "коментар" -#: contrib/comments/models.py:70 +#: contrib/comments/models.py:74 msgid "rating #1" msgstr "популарност #1" -#: contrib/comments/models.py:71 +#: contrib/comments/models.py:75 msgid "rating #2" msgstr "популарност #2" -#: contrib/comments/models.py:72 +#: contrib/comments/models.py:76 msgid "rating #3" msgstr "популарност #3" -#: contrib/comments/models.py:73 +#: contrib/comments/models.py:77 msgid "rating #4" msgstr "популарност #4" -#: contrib/comments/models.py:74 +#: contrib/comments/models.py:78 msgid "rating #5" msgstr "популарност #5" -#: contrib/comments/models.py:75 +#: contrib/comments/models.py:79 msgid "rating #6" msgstr "популарност #6" -#: contrib/comments/models.py:76 +#: contrib/comments/models.py:80 msgid "rating #7" msgstr "популарност #7" -#: contrib/comments/models.py:77 +#: contrib/comments/models.py:81 msgid "rating #8" msgstr "популарност #8" -#: contrib/comments/models.py:82 +#: contrib/comments/models.py:86 msgid "is valid rating" msgstr "е валидна популарност" -#: contrib/comments/models.py:83 contrib/comments/models.py:169 +#: contrib/comments/models.py:87 contrib/comments/models.py:179 msgid "date/time submitted" msgstr "датум/време пријавен" -#: contrib/comments/models.py:84 contrib/comments/models.py:170 +#: contrib/comments/models.py:88 contrib/comments/models.py:180 msgid "is public" msgstr "е јавен" -#: contrib/comments/models.py:86 +#: contrib/comments/models.py:90 msgid "is removed" msgstr "е отстранет" -#: contrib/comments/models.py:86 +#: contrib/comments/models.py:90 msgid "" "Check this box if the comment is inappropriate. A \"This comment has been " "removed\" message will be displayed instead." @@ -1856,15 +1322,15 @@ msgstr "" "Штиклирајте го ова поле ако коментарот не е пригоден. Наместо него пораката " "„Овој коментар беше отстранет“ ќе биде прикажана." -#: contrib/comments/models.py:91 +#: contrib/comments/models.py:96 msgid "comments" msgstr "коментари" -#: contrib/comments/models.py:131 contrib/comments/models.py:207 +#: contrib/comments/models.py:140 contrib/comments/models.py:222 msgid "Content object" msgstr "Content објект" -#: contrib/comments/models.py:159 +#: contrib/comments/models.py:168 #, python-format msgid "" "Posted by %(user)s at %(date)s\n" @@ -1879,48 +1345,48 @@ msgstr "" "\n" "http://%(domain)s%(url)s" -#: contrib/comments/models.py:168 +#: contrib/comments/models.py:178 msgid "person's name" msgstr "име на личноста" -#: contrib/comments/models.py:171 +#: contrib/comments/models.py:181 msgid "ip address" msgstr "ип адреса" -#: contrib/comments/models.py:173 +#: contrib/comments/models.py:183 msgid "approved by staff" msgstr "одобрено од администраторите" -#: contrib/comments/models.py:176 +#: contrib/comments/models.py:187 msgid "free comment" msgstr "слободен коментар" -#: contrib/comments/models.py:177 +#: contrib/comments/models.py:188 msgid "free comments" msgstr "слободни коментари" -#: contrib/comments/models.py:233 +#: contrib/comments/models.py:250 msgid "score" msgstr "поени" -#: contrib/comments/models.py:234 +#: contrib/comments/models.py:251 msgid "score date" msgstr "датум поени" -#: contrib/comments/models.py:237 +#: contrib/comments/models.py:255 msgid "karma score" msgstr "карма поен" -#: contrib/comments/models.py:238 +#: contrib/comments/models.py:256 msgid "karma scores" msgstr "карма поени" -#: contrib/comments/models.py:242 +#: contrib/comments/models.py:260 #, python-format msgid "%(score)d rating by %(user)s" msgstr "%(score)d гласање за популарност од %(user)s" -#: contrib/comments/models.py:258 +#: contrib/comments/models.py:277 #, python-format msgid "" "This comment was flagged by %(user)s:\n" @@ -1931,121 +1397,40 @@ msgstr "" "\n" "%(text)s" -#: contrib/comments/models.py:265 +#: contrib/comments/models.py:285 msgid "flag date" msgstr "датум на означување" -#: contrib/comments/models.py:268 +#: contrib/comments/models.py:289 msgid "user flag" msgstr "корисничка ознака" -#: contrib/comments/models.py:269 +#: contrib/comments/models.py:290 msgid "user flags" msgstr "кориснички ознаки" -#: contrib/comments/models.py:273 +#: contrib/comments/models.py:294 #, python-format msgid "Flag by %r" msgstr "Означено од %r" -#: contrib/comments/models.py:278 +#: contrib/comments/models.py:300 msgid "deletion date" msgstr "датум на бришење" -#: contrib/comments/models.py:280 +#: contrib/comments/models.py:303 msgid "moderator deletion" msgstr "бришење од модератор" -#: contrib/comments/models.py:281 +#: contrib/comments/models.py:304 msgid "moderator deletions" msgstr "бришења од модератор" -#: contrib/comments/models.py:285 +#: contrib/comments/models.py:308 #, python-format msgid "Moderator deletion by %r" msgstr "Бришење од модератор од %r" -#: contrib/comments/views/karma.py:19 -msgid "Anonymous users cannot vote" -msgstr "Анонимните корисници неможе да гласаат" - -#: contrib/comments/views/karma.py:23 -msgid "Invalid comment ID" -msgstr "Невалидно ИД на коментарот" - -#: contrib/comments/views/karma.py:25 -msgid "No voting for yourself" -msgstr "Нема гласање за самиот себе" - -#: contrib/comments/views/comments.py:27 -msgid "This rating is required because you've entered at least one other rating." -msgstr "" -"Ова гласање за популарност е потребно бидејќи внесовте најмалку уште едно " -"друго." - -#: contrib/comments/views/comments.py:111 -#, python-format -msgid "" -"This comment was posted by a user who has posted fewer than %(count)s " -"comment:\n" -"\n" -"%(text)s" -msgid_plural "" -"This comment was posted by a user who has posted fewer than %(count)s " -"comments:\n" -"\n" -"%(text)s" -msgstr[0] "" -"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s " -"коментар:\n" -"\n" -"%(text)s" -msgstr[1] "" -"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s " -"коментари:\n" -"\n" -"%(text)s" - -#: contrib/comments/views/comments.py:116 -#, python-format -msgid "" -"This comment was posted by a sketchy user:\n" -"\n" -"%(text)s" -msgstr "" -"Овој коментар беше пратен од недоверлив корисник:\n" -"\n" -"%(text)s" - -#: contrib/comments/views/comments.py:188 -#: contrib/comments/views/comments.py:280 -msgid "Only POSTs are allowed" -msgstr "Дозволено е само POST" - -#: contrib/comments/views/comments.py:192 -#: contrib/comments/views/comments.py:284 -msgid "One or more of the required fields wasn't submitted" -msgstr "Едно или повеќе од потребните полиња не беше пополнето" - -#: contrib/comments/views/comments.py:196 -#: contrib/comments/views/comments.py:286 -msgid "Somebody tampered with the comment form (security violation)" -msgstr "Некој ја променил формата за коментари (сигурносен прекршок)" - -#: contrib/comments/views/comments.py:206 -#: contrib/comments/views/comments.py:292 -msgid "" -"The comment form had an invalid 'target' parameter -- the object ID was " -"invalid" -msgstr "" -"Формата за коментар имаше неправилен „target“ параметар - идентификациониот " -"број на објектот беше неправилен" - -#: contrib/comments/views/comments.py:257 -#: contrib/comments/views/comments.py:321 -msgid "The comment form didn't provide either 'preview' or 'post'" -msgstr "Формата за коментар не овозможи ниту „преглед“ ниту „праќање“" - #: contrib/comments/templates/comments/form.html:8 msgid "Forgotten your password?" msgstr "Ја заборавите вашата лозинка?" @@ -2082,24 +1467,427 @@ msgstr "Прегледај" msgid "Your name:" msgstr "Вашето име:" -#: contrib/localflavor/br/forms.py:18 +#: contrib/comments/views/comments.py:28 +msgid "This rating is required because you've entered at least one other rating." +msgstr "" +"Ова гласање за популарност е потребно бидејќи внесовте најмалку уште едно " +"друго." + +#: contrib/comments/views/comments.py:112 +#, python-format +msgid "" +"This comment was posted by a user who has posted fewer than %(count)s " +"comment:\n" +"\n" +"%(text)s" +msgid_plural "" +"This comment was posted by a user who has posted fewer than %(count)s " +"comments:\n" +"\n" +"%(text)s" +msgstr[0] "" +"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s " +"коментар:\n" +"\n" +"%(text)s" +msgstr[1] "" +"Овој коментар беше пратен од корисник кој пратил помалку од %(count)s " +"коментари:\n" +"\n" +"%(text)s" + +#: contrib/comments/views/comments.py:117 +#, python-format +msgid "" +"This comment was posted by a sketchy user:\n" +"\n" +"%(text)s" +msgstr "" +"Овој коментар беше пратен од недоверлив корисник:\n" +"\n" +"%(text)s" + +#: contrib/comments/views/comments.py:190 +#: contrib/comments/views/comments.py:283 +msgid "Only POSTs are allowed" +msgstr "Дозволено е само POST" + +#: contrib/comments/views/comments.py:194 +#: contrib/comments/views/comments.py:287 +msgid "One or more of the required fields wasn't submitted" +msgstr "Едно или повеќе од потребните полиња не беше пополнето" + +#: contrib/comments/views/comments.py:198 +#: contrib/comments/views/comments.py:289 +msgid "Somebody tampered with the comment form (security violation)" +msgstr "Некој ја променил формата за коментари (сигурносен прекршок)" + +#: contrib/comments/views/comments.py:208 +#: contrib/comments/views/comments.py:295 +msgid "" +"The comment form had an invalid 'target' parameter -- the object ID was " +"invalid" +msgstr "" +"Формата за коментар имаше неправилен „target“ параметар - идентификациониот " +"број на објектот беше неправилен" + +#: contrib/comments/views/comments.py:259 +#: contrib/comments/views/comments.py:324 +msgid "The comment form didn't provide either 'preview' or 'post'" +msgstr "Формата за коментар не овозможи ниту „преглед“ ниту „праќање“" + +#: contrib/comments/views/karma.py:21 +msgid "Anonymous users cannot vote" +msgstr "Анонимните корисници неможе да гласаат" + +#: contrib/comments/views/karma.py:25 +msgid "Invalid comment ID" +msgstr "Невалидно ИД на коментарот" + +#: contrib/comments/views/karma.py:27 +msgid "No voting for yourself" +msgstr "Нема гласање за самиот себе" + +#: contrib/contenttypes/models.py:67 +msgid "python model class name" +msgstr "има на класата на питон моделите" + +#: contrib/contenttypes/models.py:71 +msgid "content type" +msgstr "content type" + +#: contrib/contenttypes/models.py:72 +msgid "content types" +msgstr "content types" + +#: contrib/flatpages/models.py:9 +msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes." +msgstr "" +"На пр. „/za/kontakt/“. Осигурајте се да имате коса црта и на крајот и на " +"почетокот." + +#: contrib/flatpages/models.py:10 +msgid "title" +msgstr "наслов" + +#: contrib/flatpages/models.py:11 +msgid "content" +msgstr "содржина" + +#: contrib/flatpages/models.py:12 +msgid "enable comments" +msgstr "овозможи коментари" + +#: contrib/flatpages/models.py:13 +msgid "template name" +msgstr "име на шаблонот" + +#: contrib/flatpages/models.py:14 +msgid "" +"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " +"will use 'flatpages/default.html'." +msgstr "" +"На пр. „flatpages/kontakt.html'. Ако не го внесете ова, системот ќе користи " +"„flatpages/default.html“." + +#: contrib/flatpages/models.py:15 +msgid "registration required" +msgstr "потребна е регистрација" + +#: contrib/flatpages/models.py:15 +msgid "If this is checked, only logged-in users will be able to view the page." +msgstr "" +"Ако ова е штиклирано, само најавените корисници ќе можат да ја гледаат оваа " +"страница." + +#: contrib/flatpages/models.py:20 +msgid "flat page" +msgstr "статична страница" + +#: contrib/flatpages/models.py:21 +msgid "flat pages" +msgstr "статични страници" + +#: contrib/flatpages/models.py:27 +msgid "Advanced options" +msgstr "Напредни можности" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "th" +msgstr "th" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "st" +msgstr "st" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "nd" +msgstr "nd" + +#: contrib/humanize/templatetags/humanize.py:19 +msgid "rd" +msgstr "rd" + +#: contrib/humanize/templatetags/humanize.py:51 +#, python-format +msgid "%(value).1f million" +msgid_plural "%(value).1f million" +msgstr[0] "%(value).1f милион" +msgstr[1] "%(value).1f милион" + +#: contrib/humanize/templatetags/humanize.py:54 +#, python-format +msgid "%(value).1f billion" +msgid_plural "%(value).1f billion" +msgstr[0] "%(value).1f милијарда" +msgstr[1] "%(value).1f милијарда" + +#: contrib/humanize/templatetags/humanize.py:57 +#, python-format +msgid "%(value).1f trillion" +msgid_plural "%(value).1f trillion" +msgstr[0] "%(value).1f трилион" +msgstr[1] "%(value).1f трилион" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "one" +msgstr "еден" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "two" +msgstr "два" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "three" +msgstr "три" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "four" +msgstr "четири" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "five" +msgstr "пет" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "six" +msgstr "шест" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "seven" +msgstr "седум" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "eight" +msgstr "осум" + +#: contrib/humanize/templatetags/humanize.py:73 +msgid "nine" +msgstr "девет" + +#: contrib/humanize/templatetags/humanize.py:93 +msgid "today" +msgstr "денеска" + +#: contrib/humanize/templatetags/humanize.py:95 +msgid "tomorrow" +msgstr "утре" + +#: contrib/humanize/templatetags/humanize.py:97 +msgid "yesterday" +msgstr "вчера" + +#: contrib/localflavor/ar/forms.py:27 +msgid "Enter a postal code in the format NNNN or ANNNNAAA." +msgstr "Внесете поштенски број во форматот NNNN или ANNNNAAA." + +#: contrib/localflavor/ar/forms.py:49 contrib/localflavor/br/forms.py:96 +#: contrib/localflavor/br/forms.py:135 contrib/localflavor/pe/forms.py:23 +#: contrib/localflavor/pe/forms.py:51 +msgid "This field requires only numbers." +msgstr "Во ова поле смее да бидат само бројки." + +#: contrib/localflavor/ar/forms.py:50 +msgid "This field requires 7 or 8 digits." +msgstr "Во ова поле смее да има 7 или 8 цифри." + +#: contrib/localflavor/ar/forms.py:79 +msgid "Enter a valid CUIT in XX-XXXXXXXX-X or XXXXXXXXXXXX format." +msgstr "Внесете правилен CUIT во XX-XXXXXXXX-X or XXXXXXXXXXXX формат." + +#: contrib/localflavor/ar/forms.py:80 +msgid "Invalid CUIT." +msgstr "Неправилен CUIT." + +#: contrib/localflavor/au/forms.py:16 +msgid "Enter a 4 digit post code." +msgstr "Внесете 4 цифрен поштенски број." + +#: contrib/localflavor/br/forms.py:21 msgid "Enter a zip code in the format XXXXX-XXX." -msgstr "Внесете правилен поштенски број во форматот XXXXX-XXX." +msgstr "Внесете правилен поштенски број во форматот XXXXX-XXX." #: contrib/localflavor/br/forms.py:30 msgid "Phone numbers must be in XX-XXXX-XXXX format." msgstr "Телефонските броеви мора да бидат во XX-XXXX-XXXX форматот." -#: contrib/localflavor/de/forms.py:16 contrib/localflavor/fi/forms.py:14 -#: contrib/localflavor/fr/forms.py:17 contrib/localflavor/it/forms.py:14 -msgid "Enter a zip code in the format XXXXX." -msgstr "Внесете правилен поштенски број во формат XXXXXX." - -#: contrib/localflavor/de/forms.py:60 +#: contrib/localflavor/br/forms.py:58 msgid "" -"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " -"format." -msgstr "Внесете правилен број на лична карта во Германија во XXXXXXXXXXX-XXXXXXX-XXXXXXX-X форматот." +"Select a valid brazilian state. That state is not one of the available " +"states." +msgstr "Изберете правилна бразилска држава. Оваа држава не е од достапните држави." + +#: contrib/localflavor/br/forms.py:94 +msgid "Invalid CPF number." +msgstr "Неправилен CPF број." + +#: contrib/localflavor/br/forms.py:95 +msgid "This field requires at most 11 digits or 14 characters." +msgstr "Во ова поле смее да има најмногу 11 цифри или 14 знаци." + +#: contrib/localflavor/br/forms.py:134 +msgid "Invalid CNPJ number." +msgstr "Неправилен CNPJ број." + +#: contrib/localflavor/br/forms.py:136 +msgid "This field requires at least 14 digits" +msgstr "Во ова поле треба да има најмалку 14 цифри" + +#: contrib/localflavor/ca/forms.py:17 +msgid "Enter a postal code in the format XXX XXX." +msgstr "Внесете правилен поштенски број во формат XXX XXX." + +#: contrib/localflavor/ca/forms.py:88 +msgid "Enter a valid Canadian Social Insurance number in XXX-XXX-XXX format." +msgstr "Внесте правилен канадски број за осигурување во XXX-XXX-XXX форматот." + +#: contrib/localflavor/ch/ch_states.py:5 +msgid "Aargau" +msgstr "Aargau" + +#: contrib/localflavor/ch/ch_states.py:6 +msgid "Appenzell Innerrhoden" +msgstr "Appenzell Innerrhoden" + +#: contrib/localflavor/ch/ch_states.py:7 +msgid "Appenzell Ausserrhoden" +msgstr "Appenzell Ausserrhoden" + +#: contrib/localflavor/ch/ch_states.py:8 +msgid "Basel-Stadt" +msgstr "Basel-Stadt" + +#: contrib/localflavor/ch/ch_states.py:9 +msgid "Basel-Land" +msgstr "Basel-Land" + +#: contrib/localflavor/ch/ch_states.py:10 +msgid "Berne" +msgstr "Berne" + +#: contrib/localflavor/ch/ch_states.py:11 +msgid "Fribourg" +msgstr "Fribourg" + +#: contrib/localflavor/ch/ch_states.py:12 +msgid "Geneva" +msgstr "Женева" + +#: contrib/localflavor/ch/ch_states.py:13 +msgid "Glarus" +msgstr "Glarus" + +#: contrib/localflavor/ch/ch_states.py:14 +msgid "Graubuenden" +msgstr "Graubuenden" + +#: contrib/localflavor/ch/ch_states.py:15 +msgid "Jura" +msgstr "Jura" + +#: contrib/localflavor/ch/ch_states.py:16 +msgid "Lucerne" +msgstr "Lucerne" + +#: contrib/localflavor/ch/ch_states.py:17 +msgid "Neuchatel" +msgstr "Neuchatel" + +#: contrib/localflavor/ch/ch_states.py:18 +msgid "Nidwalden" +msgstr "Nidwalden" + +#: contrib/localflavor/ch/ch_states.py:19 +msgid "Obwalden" +msgstr "Obwalden" + +#: contrib/localflavor/ch/ch_states.py:20 +msgid "Schaffhausen" +msgstr "Schaffhausen" + +#: contrib/localflavor/ch/ch_states.py:21 +msgid "Schwyz" +msgstr "Schwyz" + +#: contrib/localflavor/ch/ch_states.py:22 +msgid "Solothurn" +msgstr "Solothurn" + +#: contrib/localflavor/ch/ch_states.py:23 +msgid "St. Gallen" +msgstr "St. Gallen" + +#: contrib/localflavor/ch/ch_states.py:24 +msgid "Thurgau" +msgstr "Thurgau" + +#: contrib/localflavor/ch/ch_states.py:25 +msgid "Ticino" +msgstr "Ticino" + +#: contrib/localflavor/ch/ch_states.py:26 +msgid "Uri" +msgstr "Uri" + +#: contrib/localflavor/ch/ch_states.py:27 +msgid "Valais" +msgstr "Valais" + +#: contrib/localflavor/ch/ch_states.py:28 +msgid "Vaud" +msgstr "Vaud" + +#: contrib/localflavor/ch/ch_states.py:29 +msgid "Zug" +msgstr "Zug" + +#: contrib/localflavor/ch/ch_states.py:30 +msgid "Zurich" +msgstr "Цирих" + +#: contrib/localflavor/ch/forms.py:16 contrib/localflavor/no/forms.py:12 +msgid "Enter a zip code in the format XXXX." +msgstr "Внесете правилен поштенски број во форматот XXXX." + +#: contrib/localflavor/ch/forms.py:64 +msgid "" +"Enter a valid Swiss identity or passport card number in X1234567<0 or " +"1234567890 format." +msgstr "" +"Внесете правилен швајцарски број на пасош во X1234567<0 или " +" 1234567890 формат." + +#: contrib/localflavor/cl/forms.py:29 +msgid "Enter a valid Chilean RUT." +msgstr "Внесете правилeн RUT за Чиле." + +#: contrib/localflavor/cl/forms.py:30 +msgid "Enter a valid Chilean RUT. The format is XX.XXX.XXX-X." +msgstr "Внесете правилен RUT за Чиле. Форматот е Xx.XXX.XXX-X." + +#: contrib/localflavor/cl/forms.py:31 +msgid "The Chilean RUT is not valid." +msgstr "RUT бројот за Чиле е невалиден." #: contrib/localflavor/de/de_states.py:5 msgid "Baden-Wuerttemberg" @@ -2165,11 +1953,353 @@ msgstr "Шлесвиг-Холштајн" msgid "Thuringia" msgstr "Турингиа" -#: contrib/localflavor/fi/forms.py:40 contrib/localflavor/fi/forms.py:46 +#: contrib/localflavor/de/forms.py:14 contrib/localflavor/fi/forms.py:12 +#: contrib/localflavor/fr/forms.py:15 +msgid "Enter a zip code in the format XXXXX." +msgstr "Внесете правилен поштенски број во формат XXXXXX." + +#: contrib/localflavor/de/forms.py:41 +msgid "" +"Enter a valid German identity card number in XXXXXXXXXXX-XXXXXXX-XXXXXXX-X " +"format." +msgstr "" +"Внесете правилен број на лична карта во Германија во XXXXXXXXXXX-XXXXXXX-" +"XXXXXXX-X форматот." + +#: contrib/localflavor/es/es_provinces.py:5 +msgid "Arava" +msgstr "Arava" + +#: contrib/localflavor/es/es_provinces.py:6 +msgid "Albacete" +msgstr "Albacete" + +#: contrib/localflavor/es/es_provinces.py:7 +msgid "Alacant" +msgstr "Alacant" + +#: contrib/localflavor/es/es_provinces.py:8 +msgid "Almeria" +msgstr "Almeria" + +#: contrib/localflavor/es/es_provinces.py:9 +msgid "Avila" +msgstr "Авила" + +#: contrib/localflavor/es/es_provinces.py:10 +msgid "Badajoz" +msgstr "Badajoz" + +#: contrib/localflavor/es/es_provinces.py:11 +msgid "Illes Balears" +msgstr "Illes Balears" + +#: contrib/localflavor/es/es_provinces.py:12 +msgid "Barcelona" +msgstr "Барцелона" + +#: contrib/localflavor/es/es_provinces.py:13 +msgid "Burgos" +msgstr "Burgos" + +#: contrib/localflavor/es/es_provinces.py:14 +msgid "Caceres" +msgstr "Caceres" + +#: contrib/localflavor/es/es_provinces.py:15 +msgid "Cadiz" +msgstr "Cadiz" + +#: contrib/localflavor/es/es_provinces.py:16 +msgid "Castello" +msgstr "Castello" + +#: contrib/localflavor/es/es_provinces.py:17 +msgid "Ciudad Real" +msgstr "Ciudad Real" + +#: contrib/localflavor/es/es_provinces.py:18 +msgid "Cordoba" +msgstr "Кордоба" + +#: contrib/localflavor/es/es_provinces.py:19 +msgid "A Coruna" +msgstr "A Coruna" + +#: contrib/localflavor/es/es_provinces.py:20 +msgid "Cuenca" +msgstr "Cuenca" + +#: contrib/localflavor/es/es_provinces.py:21 +msgid "Girona" +msgstr "Girona" + +#: contrib/localflavor/es/es_provinces.py:22 +msgid "Granada" +msgstr "Granada" + +#: contrib/localflavor/es/es_provinces.py:23 +msgid "Guadalajara" +msgstr "Guadalajara" + +#: contrib/localflavor/es/es_provinces.py:24 +msgid "Guipuzkoa" +msgstr "Guipuzkoa" + +#: contrib/localflavor/es/es_provinces.py:25 +msgid "Huelva" +msgstr "Huelva" + +#: contrib/localflavor/es/es_provinces.py:26 +msgid "Huesca" +msgstr "Huesca" + +#: contrib/localflavor/es/es_provinces.py:27 +msgid "Jaen" +msgstr "Jaen" + +#: contrib/localflavor/es/es_provinces.py:28 +msgid "Leon" +msgstr "Леон" + +#: contrib/localflavor/es/es_provinces.py:29 +msgid "Lleida" +msgstr "Lleida" + +#: contrib/localflavor/es/es_provinces.py:30 +#: contrib/localflavor/es/es_regions.py:17 +msgid "La Rioja" +msgstr "La Rioja" + +#: contrib/localflavor/es/es_provinces.py:31 +msgid "Lugo" +msgstr "Луго" + +#: contrib/localflavor/es/es_provinces.py:32 +#: contrib/localflavor/es/es_regions.py:18 +msgid "Madrid" +msgstr "Мадрид" + +#: contrib/localflavor/es/es_provinces.py:33 +msgid "Malaga" +msgstr "Малага" + +#: contrib/localflavor/es/es_provinces.py:34 +msgid "Murcia" +msgstr "Murcia" + +#: contrib/localflavor/es/es_provinces.py:35 +msgid "Navarre" +msgstr "Navarre" + +#: contrib/localflavor/es/es_provinces.py:36 +msgid "Ourense" +msgstr "Ourense" + +#: contrib/localflavor/es/es_provinces.py:37 +msgid "Asturias" +msgstr "Asturias" + +#: contrib/localflavor/es/es_provinces.py:38 +msgid "Palencia" +msgstr "Palencia" + +#: contrib/localflavor/es/es_provinces.py:39 +msgid "Las Palmas" +msgstr "Las Palmas" + +#: contrib/localflavor/es/es_provinces.py:40 +msgid "Pontevedra" +msgstr "Pontevedra" + +#: contrib/localflavor/es/es_provinces.py:41 +msgid "Salamanca" +msgstr "Salamanca" + +#: contrib/localflavor/es/es_provinces.py:42 +msgid "Santa Cruz de Tenerife" +msgstr "Санта Круз и Тенерифе" + +#: contrib/localflavor/es/es_provinces.py:43 +#: contrib/localflavor/es/es_regions.py:11 +msgid "Cantabria" +msgstr "Cantabria" + +#: contrib/localflavor/es/es_provinces.py:44 +msgid "Segovia" +msgstr "Segovia" + +#: contrib/localflavor/es/es_provinces.py:45 +msgid "Seville" +msgstr "Севиља" + +#: contrib/localflavor/es/es_provinces.py:46 +msgid "Soria" +msgstr "Soria" + +#: contrib/localflavor/es/es_provinces.py:47 +msgid "Tarragona" +msgstr "Tarragona" + +#: contrib/localflavor/es/es_provinces.py:48 +msgid "Teruel" +msgstr "Teruel" + +#: contrib/localflavor/es/es_provinces.py:49 +msgid "Toledo" +msgstr "Толедо" + +#: contrib/localflavor/es/es_provinces.py:50 +msgid "Valencia" +msgstr "Валенсија" + +#: contrib/localflavor/es/es_provinces.py:51 +msgid "Valladolid" +msgstr "Valladolid" + +#: contrib/localflavor/es/es_provinces.py:52 +msgid "Bizkaia" +msgstr "Bizkaia" + +#: contrib/localflavor/es/es_provinces.py:53 +msgid "Zamora" +msgstr "Zamora" + +#: contrib/localflavor/es/es_provinces.py:54 +msgid "Zaragoza" +msgstr "Сарагоса" + +#: contrib/localflavor/es/es_provinces.py:55 +msgid "Ceuta" +msgstr "Ceuta" + +#: contrib/localflavor/es/es_provinces.py:56 +msgid "Melilla" +msgstr "Melilla" + +#: contrib/localflavor/es/es_regions.py:5 +msgid "Andalusia" +msgstr "Андалузија" + +#: contrib/localflavor/es/es_regions.py:6 +msgid "Aragon" +msgstr "Арагон" + +#: contrib/localflavor/es/es_regions.py:7 +msgid "Principality of Asturias" +msgstr "Principality of Asturias" + +#: contrib/localflavor/es/es_regions.py:8 +msgid "Balearic Islands" +msgstr "Острови Балеарик" + +#: contrib/localflavor/es/es_regions.py:9 +msgid "Basque Country" +msgstr "Баскија" + +#: contrib/localflavor/es/es_regions.py:10 +msgid "Canary Islands" +msgstr "Канарски острови" + +#: contrib/localflavor/es/es_regions.py:12 +msgid "Castile-La Mancha" +msgstr "Кастиља ла Манча" + +#: contrib/localflavor/es/es_regions.py:13 +msgid "Castile and Leon" +msgstr "Кастиња и Леон" + +#: contrib/localflavor/es/es_regions.py:14 +msgid "Catalonia" +msgstr "Каталонија" + +#: contrib/localflavor/es/es_regions.py:15 +msgid "Extremadura" +msgstr "Екстремадура" + +#: contrib/localflavor/es/es_regions.py:16 +msgid "Galicia" +msgstr "Галиција" + +#: contrib/localflavor/es/es_regions.py:19 +msgid "Region of Murcia" +msgstr "Регион Мурција" + +#: contrib/localflavor/es/es_regions.py:20 +msgid "Foral Community of Navarre" +msgstr "Foral Community of Navarre" + +#: contrib/localflavor/es/es_regions.py:21 +msgid "Valencian Community" +msgstr "Valencian Community" + +#: contrib/localflavor/es/forms.py:19 +msgid "Enter a valid postal code in the range and format 01XXX - 52XXX." +msgstr "Внесете поштенски број во опсег и формат 01XXX - 52XXX." + +#: contrib/localflavor/es/forms.py:39 +msgid "" +"Enter a valid phone number in one of the formats 6XXXXXXXX, 8XXXXXXXX or " +"9XXXXXXXX." +msgstr "Внесете правилен телефонски број во еден од формативе 6XXXXXXXX, 8XXXXXXXX или 9XXXXXXXX." + +#: contrib/localflavor/es/forms.py:66 +msgid "Please enter a valid NIF, NIE, or CIF." +msgstr "Ве молам внесете правиелн NIF, NIE или CIF." + +#: contrib/localflavor/es/forms.py:67 +msgid "Please enter a valid NIF or NIE." +msgstr "Ве молам внесете валиден NIF или NIE." + +#: contrib/localflavor/es/forms.py:68 +msgid "Invalid checksum for NIF." +msgstr "Неправилна контролна сума за NIF." + +#: contrib/localflavor/es/forms.py:69 +msgid "Invalid checksum for NIE." +msgstr "Неправилна контролна сума за NIE." + +#: contrib/localflavor/es/forms.py:70 +msgid "Invalid checksum for CIF." +msgstr "Неправилна контролна сум за CIF." + +#: contrib/localflavor/es/forms.py:142 +msgid "Please enter a valid bank account number in format XXXX-XXXX-XX-XXXXXXXXXX." +msgstr "Внесете правилна банкарска сметка во формат XXXX-XXXX-XX-XXXXXXXXXX." + +#: contrib/localflavor/es/forms.py:143 +msgid "Invalid checksum for bank account number." +msgstr "Неправилна контролна сума за бројот на банкарската сметка." + +#: contrib/localflavor/fi/forms.py:28 msgid "Enter a valid Finnish social security number." msgstr "Внесте правилен фински матичен број." -#: contrib/localflavor/jp/forms.py:21 +#: contrib/localflavor/in_/forms.py:14 +msgid "Enter a zip code in the format XXXXXXX." +msgstr "Внесете правилен поштенски број во форматот XXXXXXXX." + +#: contrib/localflavor/is_/forms.py:17 +msgid "Enter a valid Icelandic identification number. The format is XXXXXX-XXXX." +msgstr "Внесете валиден идентификационен број од Исланд. Форматот е XXXXXX-XXXX." + +#: contrib/localflavor/is_/forms.py:18 +msgid "The Icelandic identification number is not valid." +msgstr "Исландскиот идентификационент број е невалиден." + +#: contrib/localflavor/it/forms.py:14 +msgid "Enter a valid zip code." +msgstr "Внесете правилен поштенски број." + +#: contrib/localflavor/it/forms.py:43 +msgid "Enter a valid Social Security number." +msgstr "Внесете правилен осигурителен број." + +#: contrib/localflavor/it/forms.py:68 +msgid "Enter a valid VAT number." +msgstr "Внесете правилен даночен број." + +#: contrib/localflavor/jp/forms.py:17 msgid "Enter a postal code in the format XXXXXXX or XXX-XXXX." msgstr "Внесете поштенски број во форматот XXXXXXX или XXX-XXXX." @@ -2361,104 +2491,1596 @@ msgstr "Кагошима" msgid "Okinawa" msgstr "Окинава" -#: contrib/localflavor/no/forms.py:15 -msgid "Enter a zip code in the format XXXX." -msgstr "Внесете правилен поштенски број во форматот XXXX." +#: contrib/localflavor/mx/mx_states.py:12 +msgid "Aguascalientes" +msgstr "Aguascalientes" -#: contrib/localflavor/no/forms.py:36 +#: contrib/localflavor/mx/mx_states.py:13 +msgid "Baja California" +msgstr "Баја Калифорнија" + +#: contrib/localflavor/mx/mx_states.py:14 +msgid "Baja California Sur" +msgstr "Baja California Sur" + +#: contrib/localflavor/mx/mx_states.py:15 +msgid "Campeche" +msgstr "Кампеш" + +#: contrib/localflavor/mx/mx_states.py:16 +msgid "Chihuahua" +msgstr "Chihuahua" + +#: contrib/localflavor/mx/mx_states.py:17 +msgid "Chiapas" +msgstr "Чиапас" + +#: contrib/localflavor/mx/mx_states.py:18 +msgid "Coahuila" +msgstr "Coahuila" + +#: contrib/localflavor/mx/mx_states.py:19 +msgid "Colima" +msgstr "Колима" + +#: contrib/localflavor/mx/mx_states.py:20 +msgid "Distrito Federal" +msgstr "Distrito Federal" + +#: contrib/localflavor/mx/mx_states.py:21 +msgid "Durango" +msgstr "Дуранго" + +#: contrib/localflavor/mx/mx_states.py:22 +msgid "Guerrero" +msgstr "Гуереро" + +#: contrib/localflavor/mx/mx_states.py:23 +msgid "Guanajuato" +msgstr "Guanajuato" + +#: contrib/localflavor/mx/mx_states.py:24 +msgid "Hidalgo" +msgstr "Хидалго" + +#: contrib/localflavor/mx/mx_states.py:25 +msgid "Jalisco" +msgstr "Џалиско" + +#: contrib/localflavor/mx/mx_states.py:26 +msgid "Estado de México" +msgstr "Estado de México" + +#: contrib/localflavor/mx/mx_states.py:27 +msgid "Michoacán" +msgstr "Michoacán" + +#: contrib/localflavor/mx/mx_states.py:28 +msgid "Morelos" +msgstr "Morelos" + +#: contrib/localflavor/mx/mx_states.py:29 +msgid "Nayarit" +msgstr "Nayarit" + +#: contrib/localflavor/mx/mx_states.py:30 +msgid "Nuevo León" +msgstr "Nuevo León" + +#: contrib/localflavor/mx/mx_states.py:31 +msgid "Oaxaca" +msgstr "Oaxaca" + +#: contrib/localflavor/mx/mx_states.py:32 +msgid "Puebla" +msgstr "Puebla" + +#: contrib/localflavor/mx/mx_states.py:33 +msgid "Querétaro" +msgstr "Querétaro" + +#: contrib/localflavor/mx/mx_states.py:34 +msgid "Quintana Roo" +msgstr "Куантана Ро" + +#: contrib/localflavor/mx/mx_states.py:35 +msgid "Sinaloa" +msgstr "Синалоа" + +#: contrib/localflavor/mx/mx_states.py:36 +msgid "San Luis Potosí" +msgstr "Сан Луис Потоси" + +#: contrib/localflavor/mx/mx_states.py:37 +msgid "Sonora" +msgstr "Сонора" + +#: contrib/localflavor/mx/mx_states.py:38 +msgid "Tabasco" +msgstr "Табаско" + +#: contrib/localflavor/mx/mx_states.py:39 +msgid "Tamaulipas" +msgstr "Тамаулипас" + +#: contrib/localflavor/mx/mx_states.py:40 +msgid "Tlaxcala" +msgstr "Tlaxcala" + +#: contrib/localflavor/mx/mx_states.py:41 +msgid "Veracruz" +msgstr "Веракруз" + +#: contrib/localflavor/mx/mx_states.py:42 +msgid "Yucatán" +msgstr "Јукатан" + +#: contrib/localflavor/mx/mx_states.py:43 +msgid "Zacatecas" +msgstr "Зацатекас" + +#: contrib/localflavor/nl/forms.py:21 +msgid "Enter a valid postal code" +msgstr "Внесете правилен поштенски код" + +#: contrib/localflavor/nl/forms.py:52 +msgid "Enter a valid phone number" +msgstr "Внесете валиден телефонски број" + +#: contrib/localflavor/nl/forms.py:78 +msgid "Enter a valid SoFi number" +msgstr "Внесете валиден осигурителен број" + +#: contrib/localflavor/nl/nl_provinces.py:4 +msgid "Drente" +msgstr "Дренте" + +#: contrib/localflavor/nl/nl_provinces.py:5 +msgid "Flevoland" +msgstr "Флеволанд" + +#: contrib/localflavor/nl/nl_provinces.py:6 +msgid "Friesland" +msgstr "Фраисланд" + +#: contrib/localflavor/nl/nl_provinces.py:7 +msgid "Gelderland" +msgstr "Гелдерланд" + +#: contrib/localflavor/nl/nl_provinces.py:8 +msgid "Groningen" +msgstr "Гронинген" + +#: contrib/localflavor/nl/nl_provinces.py:9 +msgid "Limburg" +msgstr "Лимбург" + +#: contrib/localflavor/nl/nl_provinces.py:10 +msgid "Noord-Brabant" +msgstr "Noord-Brabant" + +#: contrib/localflavor/nl/nl_provinces.py:11 +msgid "Noord-Holland" +msgstr "Noord-Holland" + +#: contrib/localflavor/nl/nl_provinces.py:12 +msgid "Overijssel" +msgstr "Overijssel" + +#: contrib/localflavor/nl/nl_provinces.py:13 +msgid "Utrecht" +msgstr "Утрехт" + +#: contrib/localflavor/nl/nl_provinces.py:14 +msgid "Zeeland" +msgstr "Зиланд" + +#: contrib/localflavor/nl/nl_provinces.py:15 +msgid "Zuid-Holland" +msgstr "Zuid-Holland" + +#: contrib/localflavor/no/forms.py:33 msgid "Enter a valid Norwegian social security number." msgstr "Ве молам внесете правилен норвешки матичен број." -#: contrib/localflavor/uk/forms.py:18 -msgid "Enter a postcode. A space is required between the two postcode parts." -msgstr "Внесете поштенски број. Задолжително е празно место помеѓу двата дела на поштенскиот број." +#: contrib/localflavor/pe/forms.py:24 +msgid "This field requires 8 digits." +msgstr "Во ова поле мора да се внесат 8 цифри." -#: contrib/localflavor/usa/forms.py:18 +#: contrib/localflavor/pe/forms.py:52 +msgid "This field requires 11 digits." +msgstr "Во ова поле се потребни 11 цифри." + +#: contrib/localflavor/pl/forms.py:39 +msgid "National Identification Number consists of 11 digits." +msgstr "Националниот идентификационен број се состои од 11 цифири." + +#: contrib/localflavor/pl/forms.py:40 +msgid "Wrong checksum for the National Identification Number." +msgstr "Погрешна проверка за Националниот идентификационен број." + +#: contrib/localflavor/pl/forms.py:72 +msgid "Enter a tax number field (NIP) in the format XXX-XXX-XX-XX or XX-XX-XXX-XXX." +msgstr "Внесете даночен број (NIP) во форматот XXX-XXX-XX-XX или XX-XX-XXX-XXX." + +#: contrib/localflavor/pl/forms.py:73 +msgid "Wrong checksum for the Tax Number (NIP)." +msgstr "Даночниот број (NIP) е погрешен." + +#: contrib/localflavor/pl/forms.py:112 +msgid "National Business Register Number (REGON) consists of 7 or 9 digits." +msgstr "Националниот бизнис регистрациски број (REGON) се состои од 7 или 9 цифри." + +#: contrib/localflavor/pl/forms.py:113 +msgid "Wrong checksum for the National Business Register Number (REGON)." +msgstr "Неправилна контролна сум за Националниот бизнис регистрационен број (REGON)." + +#: contrib/localflavor/pl/forms.py:156 +msgid "Enter a postal code in the format XX-XXX." +msgstr "Внесете правилен поштенски број во формат XX-XXX." + +#: contrib/localflavor/pl/pl_voivodeships.py:8 +msgid "Lower Silesia" +msgstr "Долна Силесиа" + +#: contrib/localflavor/pl/pl_voivodeships.py:9 +msgid "Kuyavia-Pomerania" +msgstr "Kuyavia-Pomerania" + +#: contrib/localflavor/pl/pl_voivodeships.py:10 +msgid "Lublin" +msgstr "Лублин" + +#: contrib/localflavor/pl/pl_voivodeships.py:11 +msgid "Lubusz" +msgstr "Лубус" + +#: contrib/localflavor/pl/pl_voivodeships.py:12 +msgid "Lodz" +msgstr "Лодз" + +#: contrib/localflavor/pl/pl_voivodeships.py:13 +msgid "Lesser Poland" +msgstr "Lesser Poland" + +#: contrib/localflavor/pl/pl_voivodeships.py:14 +msgid "Masovia" +msgstr "Масовиа" + +#: contrib/localflavor/pl/pl_voivodeships.py:15 +msgid "Opole" +msgstr "Ополе" + +#: contrib/localflavor/pl/pl_voivodeships.py:16 +msgid "Subcarpatia" +msgstr "Субкарпатиа" + +#: contrib/localflavor/pl/pl_voivodeships.py:17 +msgid "Podlasie" +msgstr "Подласи" + +#: contrib/localflavor/pl/pl_voivodeships.py:18 +msgid "Pomerania" +msgstr "Померанија" + +#: contrib/localflavor/pl/pl_voivodeships.py:19 +msgid "Silesia" +msgstr "Силесиа" + +#: contrib/localflavor/pl/pl_voivodeships.py:20 +msgid "Swietokrzyskie" +msgstr "Swietokrzyskie" + +#: contrib/localflavor/pl/pl_voivodeships.py:21 +msgid "Warmia-Masuria" +msgstr "Warmia-Masuria" + +#: contrib/localflavor/pl/pl_voivodeships.py:22 +msgid "Greater Poland" +msgstr "Greater Poland" + +#: contrib/localflavor/pl/pl_voivodeships.py:23 +msgid "West Pomerania" +msgstr "Западна Померанија" + +#: contrib/localflavor/sk/forms.py:30 +msgid "Enter a postal code in the format XXXXX or XXX XX." +msgstr "Внесете поштенски број во форматот XXXXX или XXX XX." + +#: contrib/localflavor/sk/sk_districts.py:8 +msgid "Banska Bystrica" +msgstr "Банска Бистрица" + +#: contrib/localflavor/sk/sk_districts.py:9 +msgid "Banska Stiavnica" +msgstr "Банска Стиавница" + +#: contrib/localflavor/sk/sk_districts.py:10 +msgid "Bardejov" +msgstr "Бардејов" + +#: contrib/localflavor/sk/sk_districts.py:11 +msgid "Banovce nad Bebravou" +msgstr "Бановце над Бебраво" + +#: contrib/localflavor/sk/sk_districts.py:12 +msgid "Brezno" +msgstr "Брезно" + +#: contrib/localflavor/sk/sk_districts.py:13 +msgid "Bratislava I" +msgstr "Братислава I" + +#: contrib/localflavor/sk/sk_districts.py:14 +msgid "Bratislava II" +msgstr "Братислава II" + +#: contrib/localflavor/sk/sk_districts.py:15 +msgid "Bratislava III" +msgstr "Братислава III" + +#: contrib/localflavor/sk/sk_districts.py:16 +msgid "Bratislava IV" +msgstr "Братислава IV" + +#: contrib/localflavor/sk/sk_districts.py:17 +msgid "Bratislava V" +msgstr "Братислава V" + +#: contrib/localflavor/sk/sk_districts.py:18 +msgid "Bytca" +msgstr "Битка" + +#: contrib/localflavor/sk/sk_districts.py:19 +msgid "Cadca" +msgstr "Кадка" + +#: contrib/localflavor/sk/sk_districts.py:20 +msgid "Detva" +msgstr "Детва" + +#: contrib/localflavor/sk/sk_districts.py:21 +msgid "Dolny Kubin" +msgstr "Dolny Kubin" + +#: contrib/localflavor/sk/sk_districts.py:22 +msgid "Dunajska Streda" +msgstr "Dunajska Streda" + +#: contrib/localflavor/sk/sk_districts.py:23 +msgid "Galanta" +msgstr "Galanta" + +#: contrib/localflavor/sk/sk_districts.py:24 +msgid "Gelnica" +msgstr "Гелника" + +#: contrib/localflavor/sk/sk_districts.py:25 +msgid "Hlohovec" +msgstr "Хлоховец" + +#: contrib/localflavor/sk/sk_districts.py:26 +msgid "Humenne" +msgstr "Хумен" + +#: contrib/localflavor/sk/sk_districts.py:27 +msgid "Ilava" +msgstr "Ilava" + +#: contrib/localflavor/sk/sk_districts.py:28 +msgid "Kezmarok" +msgstr "Кезмарок" + +#: contrib/localflavor/sk/sk_districts.py:29 +msgid "Komarno" +msgstr "Комарно" + +#: contrib/localflavor/sk/sk_districts.py:30 +msgid "Kosice I" +msgstr "Кошице I" + +#: contrib/localflavor/sk/sk_districts.py:31 +msgid "Kosice II" +msgstr "Кошице II" + +#: contrib/localflavor/sk/sk_districts.py:32 +msgid "Kosice III" +msgstr "Кошице III" + +#: contrib/localflavor/sk/sk_districts.py:33 +msgid "Kosice IV" +msgstr "Кошице IV" + +#: contrib/localflavor/sk/sk_districts.py:34 +msgid "Kosice - okolie" +msgstr "Кошице - околина" + +#: contrib/localflavor/sk/sk_districts.py:35 +msgid "Krupina" +msgstr "Крупина" + +#: contrib/localflavor/sk/sk_districts.py:36 +msgid "Kysucke Nove Mesto" +msgstr "Kysucke Nove Mesto" + +#: contrib/localflavor/sk/sk_districts.py:37 +msgid "Levice" +msgstr "Левице" + +#: contrib/localflavor/sk/sk_districts.py:38 +msgid "Levoca" +msgstr "Левока" + +#: contrib/localflavor/sk/sk_districts.py:39 +msgid "Liptovsky Mikulas" +msgstr "Liptovsky Mikulas" + +#: contrib/localflavor/sk/sk_districts.py:40 +msgid "Lucenec" +msgstr "Луценец" + +#: contrib/localflavor/sk/sk_districts.py:41 +msgid "Malacky" +msgstr "Malacky" + +#: contrib/localflavor/sk/sk_districts.py:42 +msgid "Martin" +msgstr "Мартин" + +#: contrib/localflavor/sk/sk_districts.py:43 +msgid "Medzilaborce" +msgstr "Medzilaborce" + +#: contrib/localflavor/sk/sk_districts.py:44 +msgid "Michalovce" +msgstr "Michalovce" + +#: contrib/localflavor/sk/sk_districts.py:45 +msgid "Myjava" +msgstr "Myjava" + +#: contrib/localflavor/sk/sk_districts.py:46 +msgid "Namestovo" +msgstr "Наместово" + +#: contrib/localflavor/sk/sk_districts.py:47 +msgid "Nitra" +msgstr "Нитра" + +#: contrib/localflavor/sk/sk_districts.py:48 +msgid "Nove Mesto nad Vahom" +msgstr "Nove Mesto nad Vahom" + +#: contrib/localflavor/sk/sk_districts.py:49 +msgid "Nove Zamky" +msgstr "Nove Zamky" + +#: contrib/localflavor/sk/sk_districts.py:50 +msgid "Partizanske" +msgstr "Партизанске" + +#: contrib/localflavor/sk/sk_districts.py:51 +msgid "Pezinok" +msgstr "Пезинок" + +#: contrib/localflavor/sk/sk_districts.py:52 +msgid "Piestany" +msgstr "Piestany" + +#: contrib/localflavor/sk/sk_districts.py:53 +msgid "Poltar" +msgstr "Полтар" + +#: contrib/localflavor/sk/sk_districts.py:54 +msgid "Poprad" +msgstr "Попрад" + +#: contrib/localflavor/sk/sk_districts.py:55 +msgid "Povazska Bystrica" +msgstr "Povazska Bystrica" + +#: contrib/localflavor/sk/sk_districts.py:56 +msgid "Presov" +msgstr "Пресов" + +#: contrib/localflavor/sk/sk_districts.py:57 +msgid "Prievidza" +msgstr "Prievidza" + +#: contrib/localflavor/sk/sk_districts.py:58 +msgid "Puchov" +msgstr "Пучов" + +#: contrib/localflavor/sk/sk_districts.py:59 +msgid "Revuca" +msgstr "Ревука" + +#: contrib/localflavor/sk/sk_districts.py:60 +msgid "Rimavska Sobota" +msgstr "Rimavska Sobota" + +#: contrib/localflavor/sk/sk_districts.py:61 +msgid "Roznava" +msgstr "Рознава" + +#: contrib/localflavor/sk/sk_districts.py:62 +msgid "Ruzomberok" +msgstr "Рузомберок" + +#: contrib/localflavor/sk/sk_districts.py:63 +msgid "Sabinov" +msgstr "Сабинов" + +#: contrib/localflavor/sk/sk_districts.py:64 +msgid "Senec" +msgstr "Сенец" + +#: contrib/localflavor/sk/sk_districts.py:65 +msgid "Senica" +msgstr "Сеника" + +#: contrib/localflavor/sk/sk_districts.py:66 +msgid "Skalica" +msgstr "Скалица" + +#: contrib/localflavor/sk/sk_districts.py:67 +msgid "Snina" +msgstr "Шнина" + +#: contrib/localflavor/sk/sk_districts.py:68 +msgid "Sobrance" +msgstr "Собранце" + +#: contrib/localflavor/sk/sk_districts.py:69 +msgid "Spisska Nova Ves" +msgstr "Spisska Nova Ves" + +#: contrib/localflavor/sk/sk_districts.py:70 +msgid "Stara Lubovna" +msgstr "Стара Љубовна" + +#: contrib/localflavor/sk/sk_districts.py:71 +msgid "Stropkov" +msgstr "Стропков" + +#: contrib/localflavor/sk/sk_districts.py:72 +msgid "Svidnik" +msgstr "Свидник" + +#: contrib/localflavor/sk/sk_districts.py:73 +msgid "Sala" +msgstr "Сала" + +#: contrib/localflavor/sk/sk_districts.py:74 +msgid "Topolcany" +msgstr "Тополчани" + +#: contrib/localflavor/sk/sk_districts.py:75 +msgid "Trebisov" +msgstr "Требисов" + +#: contrib/localflavor/sk/sk_districts.py:76 +msgid "Trencin" +msgstr "Тренцин" + +#: contrib/localflavor/sk/sk_districts.py:77 +msgid "Trnava" +msgstr "Трнава" + +#: contrib/localflavor/sk/sk_districts.py:78 +msgid "Turcianske Teplice" +msgstr "Turcianske Teplice" + +#: contrib/localflavor/sk/sk_districts.py:79 +msgid "Tvrdosin" +msgstr "Тврдосин" + +#: contrib/localflavor/sk/sk_districts.py:80 +msgid "Velky Krtis" +msgstr "Velky Krtis" + +#: contrib/localflavor/sk/sk_districts.py:81 +msgid "Vranov nad Toplou" +msgstr "Vranov nad Toplou" + +#: contrib/localflavor/sk/sk_districts.py:82 +msgid "Zlate Moravce" +msgstr "Злате Моравце" + +#: contrib/localflavor/sk/sk_districts.py:83 +msgid "Zvolen" +msgstr "Зволен" + +#: contrib/localflavor/sk/sk_districts.py:84 +msgid "Zarnovica" +msgstr "Зарновица" + +#: contrib/localflavor/sk/sk_districts.py:85 +msgid "Ziar nad Hronom" +msgstr "Ziar nad Hronom" + +#: contrib/localflavor/sk/sk_districts.py:86 +msgid "Zilina" +msgstr "Зилина" + +#: contrib/localflavor/sk/sk_regions.py:8 +msgid "Banska Bystrica region" +msgstr "Banska Bystrica region" + +#: contrib/localflavor/sk/sk_regions.py:9 +msgid "Bratislava region" +msgstr "Братиславски регион" + +#: contrib/localflavor/sk/sk_regions.py:10 +msgid "Kosice region" +msgstr "Кошице регион" + +#: contrib/localflavor/sk/sk_regions.py:11 +msgid "Nitra region" +msgstr "Нитра регион" + +#: contrib/localflavor/sk/sk_regions.py:12 +msgid "Presov region" +msgstr "Пресов регион" + +#: contrib/localflavor/sk/sk_regions.py:13 +msgid "Trencin region" +msgstr "Тренцин регион" + +#: contrib/localflavor/sk/sk_regions.py:14 +msgid "Trnava region" +msgstr "Трнава регион" + +#: contrib/localflavor/sk/sk_regions.py:15 +msgid "Zilina region" +msgstr "Зилина регион" + +#: contrib/localflavor/uk/forms.py:21 +msgid "Enter a valid postcode." +msgstr "Внесете правилен поштенски код." + +#: contrib/localflavor/uk/uk_regions.py:11 +msgid "Bedfordshire" +msgstr "Бедфордшир" + +#: contrib/localflavor/uk/uk_regions.py:12 +msgid "Buckinghamshire" +msgstr "Букингхамшир" + +#: contrib/localflavor/uk/uk_regions.py:14 +msgid "Cheshire" +msgstr "Чешир" + +#: contrib/localflavor/uk/uk_regions.py:15 +msgid "Cornwall and Isles of Scilly" +msgstr "Cornwall and Isles of Scilly" + +#: contrib/localflavor/uk/uk_regions.py:16 +msgid "Cumbria" +msgstr "Кумбриа" + +#: contrib/localflavor/uk/uk_regions.py:17 +msgid "Derbyshire" +msgstr "Дербишир" + +#: contrib/localflavor/uk/uk_regions.py:18 +msgid "Devon" +msgstr "Девон" + +#: contrib/localflavor/uk/uk_regions.py:19 +msgid "Dorset" +msgstr "Дорсет" + +#: contrib/localflavor/uk/uk_regions.py:20 +msgid "Durham" +msgstr "Дурам" + +#: contrib/localflavor/uk/uk_regions.py:21 +msgid "East Sussex" +msgstr "Источен Сасекс" + +#: contrib/localflavor/uk/uk_regions.py:22 +msgid "Essex" +msgstr "Есекс" + +#: contrib/localflavor/uk/uk_regions.py:23 +msgid "Gloucestershire" +msgstr "Gloucestershire" + +#: contrib/localflavor/uk/uk_regions.py:24 +msgid "Greater London" +msgstr "Поширок Лондон" + +#: contrib/localflavor/uk/uk_regions.py:25 +msgid "Greater Manchester" +msgstr "Поширок Манчестер" + +#: contrib/localflavor/uk/uk_regions.py:26 +msgid "Hampshire" +msgstr "Хемпшир" + +#: contrib/localflavor/uk/uk_regions.py:27 +msgid "Hertfordshire" +msgstr "Хертфордшир" + +#: contrib/localflavor/uk/uk_regions.py:28 +msgid "Kent" +msgstr "Кент" + +#: contrib/localflavor/uk/uk_regions.py:29 +msgid "Lancashire" +msgstr "Ланкашир" + +#: contrib/localflavor/uk/uk_regions.py:30 +msgid "Leicestershire" +msgstr "Leicestershire" + +#: contrib/localflavor/uk/uk_regions.py:31 +msgid "Lincolnshire" +msgstr "Линколншир" + +#: contrib/localflavor/uk/uk_regions.py:32 +msgid "Merseyside" +msgstr "Мерсејсајд" + +#: contrib/localflavor/uk/uk_regions.py:33 +msgid "Norfolk" +msgstr "Норфолк" + +#: contrib/localflavor/uk/uk_regions.py:34 +msgid "North Yorkshire" +msgstr "Северен Јоркшир" + +#: contrib/localflavor/uk/uk_regions.py:35 +msgid "Northamptonshire" +msgstr "Нортхамтоншир" + +#: contrib/localflavor/uk/uk_regions.py:36 +msgid "Northumberland" +msgstr "Northumberland" + +#: contrib/localflavor/uk/uk_regions.py:37 +msgid "Nottinghamshire" +msgstr "Нотингхамшир" + +#: contrib/localflavor/uk/uk_regions.py:38 +msgid "Oxfordshire" +msgstr "Оксфордшир" + +#: contrib/localflavor/uk/uk_regions.py:39 +msgid "Shropshire" +msgstr "Шропшир" + +#: contrib/localflavor/uk/uk_regions.py:40 +msgid "Somerset" +msgstr "Сомерсет" + +#: contrib/localflavor/uk/uk_regions.py:41 +msgid "South Yorkshire" +msgstr "Јужен Јоркшир" + +#: contrib/localflavor/uk/uk_regions.py:42 +msgid "Staffordshire" +msgstr "Стафордшир" + +#: contrib/localflavor/uk/uk_regions.py:43 +msgid "Suffolk" +msgstr "Суфолк" + +#: contrib/localflavor/uk/uk_regions.py:44 +msgid "Surrey" +msgstr "Surrey" + +#: contrib/localflavor/uk/uk_regions.py:45 +msgid "Tyne and Wear" +msgstr "Tyne and Wear" + +#: contrib/localflavor/uk/uk_regions.py:46 +msgid "Warwickshire" +msgstr "Warwickshire" + +#: contrib/localflavor/uk/uk_regions.py:47 +msgid "West Midlands" +msgstr "Западен Мидландс" + +#: contrib/localflavor/uk/uk_regions.py:48 +msgid "West Sussex" +msgstr "Западен Сасекс" + +#: contrib/localflavor/uk/uk_regions.py:49 +msgid "West Yorkshire" +msgstr "Западен Јоркшир" + +#: contrib/localflavor/uk/uk_regions.py:50 +msgid "Wiltshire" +msgstr "Вилтшир" + +#: contrib/localflavor/uk/uk_regions.py:51 +msgid "Worcestershire" +msgstr "Worcestershire" + +#: contrib/localflavor/uk/uk_regions.py:55 +msgid "County Antrim" +msgstr "County Antrim" + +#: contrib/localflavor/uk/uk_regions.py:56 +msgid "County Armagh" +msgstr "County Armagh" + +#: contrib/localflavor/uk/uk_regions.py:57 +msgid "County Down" +msgstr "County Down" + +#: contrib/localflavor/uk/uk_regions.py:58 +msgid "County Fermanagh" +msgstr "County Fermanagh" + +#: contrib/localflavor/uk/uk_regions.py:59 +msgid "County Londonderry" +msgstr "County Londonderry" + +#: contrib/localflavor/uk/uk_regions.py:60 +msgid "County Tyrone" +msgstr "County Tyrone" + +#: contrib/localflavor/uk/uk_regions.py:64 +msgid "Clwyd" +msgstr "Clwyd" + +#: contrib/localflavor/uk/uk_regions.py:65 +msgid "Dyfed" +msgstr "Dyfed" + +#: contrib/localflavor/uk/uk_regions.py:66 +msgid "Gwent" +msgstr "Гвент" + +#: contrib/localflavor/uk/uk_regions.py:67 +msgid "Gwynedd" +msgstr "Gwynedd" + +#: contrib/localflavor/uk/uk_regions.py:68 +msgid "Mid Glamorgan" +msgstr "Mid Glamorgan" + +#: contrib/localflavor/uk/uk_regions.py:69 +msgid "Powys" +msgstr "Powys" + +#: contrib/localflavor/uk/uk_regions.py:70 +msgid "South Glamorgan" +msgstr "Јужен Гламорга" + +#: contrib/localflavor/uk/uk_regions.py:71 +msgid "West Glamorgan" +msgstr "Западен Гламорган" + +#: contrib/localflavor/uk/uk_regions.py:75 +msgid "Borders" +msgstr "Borders" + +#: contrib/localflavor/uk/uk_regions.py:76 +msgid "Central Scotland" +msgstr "Централна Шкотска" + +#: contrib/localflavor/uk/uk_regions.py:77 +msgid "Dumfries and Galloway" +msgstr "Dumfries and Galloway" + +#: contrib/localflavor/uk/uk_regions.py:78 +msgid "Fife" +msgstr "Fife" + +#: contrib/localflavor/uk/uk_regions.py:79 +msgid "Grampian" +msgstr "Грампиан" + +#: contrib/localflavor/uk/uk_regions.py:80 +msgid "Highland" +msgstr "Highland" + +#: contrib/localflavor/uk/uk_regions.py:81 +msgid "Lothian" +msgstr "Lothian" + +#: contrib/localflavor/uk/uk_regions.py:82 +msgid "Orkney Islands" +msgstr "Orkney Islands" + +#: contrib/localflavor/uk/uk_regions.py:83 +msgid "Shetland Islands" +msgstr "Shetland Islands" + +#: contrib/localflavor/uk/uk_regions.py:84 +msgid "Strathclyde" +msgstr "Strathclyde" + +#: contrib/localflavor/uk/uk_regions.py:85 +msgid "Tayside" +msgstr "Tayside" + +#: contrib/localflavor/uk/uk_regions.py:86 +msgid "Western Isles" +msgstr "Western Isles" + +#: contrib/localflavor/uk/uk_regions.py:90 +msgid "England" +msgstr "Англија" + +#: contrib/localflavor/uk/uk_regions.py:91 +msgid "Northern Ireland" +msgstr "Северна Ирска" + +#: contrib/localflavor/uk/uk_regions.py:92 +msgid "Scotland" +msgstr "Шкотска" + +#: contrib/localflavor/uk/uk_regions.py:93 +msgid "Wales" +msgstr "Велс" + +#: contrib/localflavor/us/forms.py:16 msgid "Enter a zip code in the format XXXXX or XXXXX-XXXX." msgstr "Внесете поштенски број во форматот XXXXX или XXXXX-XXXX." -#: contrib/localflavor/usa/forms.py:51 +#: contrib/localflavor/us/forms.py:54 msgid "Enter a valid U.S. Social Security number in XXX-XX-XXXX format." msgstr "Внесте правилен матичен број за САД во XXX-XX-XXXX форматот." -#: contrib/sessions/models.py:68 +#: contrib/localflavor/za/forms.py:20 +msgid "Enter a valid South African ID number" +msgstr "Внесете правилен јужно афрички број за идентификација" + +#: contrib/localflavor/za/forms.py:54 +msgid "Enter a valid South African postal code" +msgstr "Внесете правилен јужно афрички поштенски код" + +#: contrib/localflavor/za/za_provinces.py:4 +msgid "Eastern Cape" +msgstr "Источен Кејп" + +#: contrib/localflavor/za/za_provinces.py:5 +msgid "Free State" +msgstr "Free State" + +#: contrib/localflavor/za/za_provinces.py:6 +msgid "Gauteng" +msgstr "Gauteng" + +#: contrib/localflavor/za/za_provinces.py:7 +msgid "KwaZulu-Natal" +msgstr "KwaZulu-Natal" + +#: contrib/localflavor/za/za_provinces.py:8 +msgid "Limpopo" +msgstr "Limpopo" + +#: contrib/localflavor/za/za_provinces.py:9 +msgid "Mpumalanga" +msgstr "Mpumalanga" + +#: contrib/localflavor/za/za_provinces.py:10 +msgid "Northern Cape" +msgstr "Northern Cape" + +#: contrib/localflavor/za/za_provinces.py:11 +msgid "North West" +msgstr "North West" + +#: contrib/localflavor/za/za_provinces.py:12 +msgid "Western Cape" +msgstr "Western Cape" + +#: contrib/redirects/models.py:7 +msgid "redirect from" +msgstr "пренасочи од" + +#: contrib/redirects/models.py:8 +msgid "" +"This should be an absolute path, excluding the domain name. Example: '/" +"events/search/'." +msgstr "" +"Ова треба да биде апсолутна патека без името на домејнот. На пр. „/nastani/" +"prebaraj/“." + +#: contrib/redirects/models.py:9 +msgid "redirect to" +msgstr "пренасочи кон" + +#: contrib/redirects/models.py:10 +msgid "" +"This can be either an absolute path (as above) or a full URL starting with " +"'http://'." +msgstr "" +"Ова може да биде или апсолутна патека (како погоре) или цела адреса " +"почувајќи со „http://“." + +#: contrib/redirects/models.py:13 +msgid "redirect" +msgstr "пренасочување" + +#: contrib/redirects/models.py:14 +msgid "redirects" +msgstr "пренасочувања" + +#: contrib/sessions/models.py:41 msgid "session key" msgstr "клуч на сесијата" -#: contrib/sessions/models.py:69 +#: contrib/sessions/models.py:42 msgid "session data" msgstr "податоци од сесијата" -#: contrib/sessions/models.py:70 +#: contrib/sessions/models.py:43 msgid "expire date" msgstr "датум на истекување" -#: contrib/sessions/models.py:74 +#: contrib/sessions/models.py:48 msgid "session" msgstr "сесија" -#: contrib/sessions/models.py:75 +#: contrib/sessions/models.py:49 msgid "sessions" msgstr "сесии" -#: contrib/contenttypes/models.py:36 -msgid "python model class name" -msgstr "има на класата на питон моделите" +#: contrib/sites/models.py:32 +msgid "domain name" +msgstr "домејн" -#: contrib/contenttypes/models.py:39 -msgid "content type" -msgstr "content type" +#: contrib/sites/models.py:33 +msgid "display name" +msgstr "име кое се прикажува" -#: contrib/contenttypes/models.py:40 -msgid "content types" -msgstr "content types" +#: contrib/sites/models.py:37 +msgid "site" +msgstr "сајт" -#: oldforms/__init__.py:392 +#: contrib/sites/models.py:38 +msgid "sites" +msgstr "сајтови" + +#: core/validators.py:72 +msgid "This value must contain only letters, numbers and underscores." +msgstr "Оваа вредност смее да има само букви, бројки или долни црти." + +#: core/validators.py:76 +msgid "" +"This value must contain only letters, numbers, underscores, dashes or " +"slashes." +msgstr "Оваа вредност смее да има само букви, бројки, долни црти, црти или коси црти." + +#: core/validators.py:80 +msgid "This value must contain only letters, numbers, underscores or hyphens." +msgstr "Оваа вредност смее да содржи само букви, бројки, долни црти или црти." + +#: core/validators.py:84 +msgid "Uppercase letters are not allowed here." +msgstr "Големи букви не се дозволени." + +#: core/validators.py:88 +msgid "Lowercase letters are not allowed here." +msgstr "Мали букви не се дозволени." + +#: core/validators.py:95 +msgid "Enter only digits separated by commas." +msgstr "Внесете само цифри одделени со запирки." + +#: core/validators.py:107 +msgid "Enter valid e-mail addresses separated by commas." +msgstr "Внесете валидни адреси за е-пошта одделени со запирки." + +#: core/validators.py:111 +msgid "Please enter a valid IP address." +msgstr "Ве молам внесете валидна ИП адреса." + +#: core/validators.py:115 +msgid "Empty values are not allowed here." +msgstr "Празни вредности не се дозволени." + +#: core/validators.py:119 +msgid "Non-numeric characters aren't allowed here." +msgstr "Ненумерички знаци не се дозволени тука." + +#: core/validators.py:123 +msgid "This value can't be comprised solely of digits." +msgstr "Оваа вредност не смее да биде само од цифри." + +#: core/validators.py:128 newforms/fields.py:152 +msgid "Enter a whole number." +msgstr "Внеси цел број." + +#: core/validators.py:132 +msgid "Only alphabetical characters are allowed here." +msgstr "Дозволени се само букви." + +#: core/validators.py:147 +msgid "Year must be 1900 or later." +msgstr "Годината мора да биде 1900 или покасно." + +#: core/validators.py:151 +#, python-format +msgid "Invalid date: %s" +msgstr "Неправилен датум: %s" + +#: core/validators.py:156 db/models/fields/__init__.py:548 +msgid "Enter a valid date in YYYY-MM-DD format." +msgstr "Внесете правилен датум во форматот ГГГГ-ММ-ДД." + +#: core/validators.py:161 +msgid "Enter a valid time in HH:MM format." +msgstr "Внесете правилно време во форматот HH:MM." + +#: core/validators.py:165 db/models/fields/__init__.py:625 +msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format." +msgstr "Внесете правилен датум/време во форматот ГГГГ-ММ-ДД ЧЧ:ММ." + +#: core/validators.py:170 newforms/fields.py:403 +msgid "Enter a valid e-mail address." +msgstr "Внесeте правилна адреса за е-пошта." + +#: core/validators.py:182 core/validators.py:474 newforms/fields.py:433 +#: oldforms/__init__.py:687 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "Не беше пратена датотека. Проверете го типот на енкодирање на формата." + +#: core/validators.py:193 newforms/fields.py:459 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Качете валидна фотографија. Датотеката која ја качивте или не беше " +"фотографија или беше расипана датотеката." + +#: core/validators.py:200 +#, python-format +msgid "The URL %s does not point to a valid image." +msgstr "Адресата %s не покажува кон валидна фотографија." + +#: core/validators.py:204 +#, python-format +msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid." +msgstr "" +"Телефонските броеви мора да бидат во XXX-XXX-XXXX форматот. „%s“ не е " +"валиден." + +#: core/validators.py:212 +#, python-format +msgid "The URL %s does not point to a valid QuickTime video." +msgstr "Адресата „%s“ не покажува кон QuickTime видео." + +#: core/validators.py:216 +msgid "A valid URL is required." +msgstr "Задолжителна е правилна адреса." + +#: core/validators.py:230 +#, python-format +msgid "" +"Valid HTML is required. Specific errors are:\n" +"%s" +msgstr "" +"Задолжителен е правилен HTML. Грешките се:\n" +"%s" + +#: core/validators.py:237 +#, python-format +msgid "Badly formed XML: %s" +msgstr "Неправилно формиран XML: %s" + +#: core/validators.py:254 +#, python-format +msgid "Invalid URL: %s" +msgstr "Неправилна адреса: %s" + +#: core/validators.py:259 core/validators.py:261 +#, python-format +msgid "The URL %s is a broken link." +msgstr "Адресата %s е скршена врска." + +#: core/validators.py:267 +msgid "Enter a valid U.S. state abbreviation." +msgstr "Внесете правилна скратеница за држава во САД." + +#: core/validators.py:281 +#, python-format +msgid "Watch your mouth! The word %s is not allowed here." +msgid_plural "Watch your mouth! The words %s are not allowed here." +msgstr[0] "Внимавајте на јазикот. Тука не е дозволен зборот %s." +msgstr[1] "Внимавајте на јазикот. Тука не се дозволени зборовите %s." + +#: core/validators.py:288 +#, python-format +msgid "This field must match the '%s' field." +msgstr "Ова поле мора да соодејствува со полето „%s“." + +#: core/validators.py:307 +msgid "Please enter something for at least one field." +msgstr "Ве молам внесете нешто во барем едно поле." + +#: core/validators.py:316 core/validators.py:327 +msgid "Please enter both fields or leave them both empty." +msgstr "Ве молам внесете во двете полиња или оставете ги двете празни." + +#: core/validators.py:335 +#, python-format +msgid "This field must be given if %(field)s is %(value)s" +msgstr "Ова поле мора да биде зададено ако %(field)s е %(value)s" + +#: core/validators.py:348 +#, python-format +msgid "This field must be given if %(field)s is not %(value)s" +msgstr "Ова поле мора да биде зададено ако %(field)s не е %(value)s" + +#: core/validators.py:367 +msgid "Duplicate values are not allowed." +msgstr "Дупликат вредности не се дозволени." + +#: core/validators.py:382 +#, python-format +msgid "This value must be between %(lower)s and %(upper)s." +msgstr "Оваа вредноста мора да биде помеѓу %(lower)s и %(upper)s." + +#: core/validators.py:384 +#, python-format +msgid "This value must be at least %s." +msgstr "Оваа вредноста мора да биде најмалку %s." + +#: core/validators.py:386 +#, python-format +msgid "This value must be no more than %s." +msgstr "Оваа вредност не смее да биде поголема од %s." + +#: core/validators.py:427 +#, python-format +msgid "This value must be a power of %s." +msgstr "Оваа вредноста мора да биде степен од %s." + +#: core/validators.py:437 +msgid "Please enter a valid decimal number." +msgstr "Ве молам внесете правилен децимален број." + +#: core/validators.py:444 +#, python-format +msgid "Please enter a valid decimal number with at most %s total digit." +msgid_plural "Please enter a valid decimal number with at most %s total digits." +msgstr[0] "Ве молам внесете правилен децимален број со најмногу %s цифрa." +msgstr[1] "Ве молам внесете правилен децимален број со најмногу %s вкупно цифри." + +#: core/validators.py:447 +#, python-format +msgid "Please enter a valid decimal number with a whole part of at most %s digit." +msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits." +msgstr[0] "" +"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s " +"цифра." +msgstr[1] "" +"Ве молам внесете правилен децимален број кој во целиот број има најмногу %s " +"цифри." + +#: core/validators.py:450 +#, python-format +msgid "Please enter a valid decimal number with at most %s decimal place." +msgid_plural "Please enter a valid decimal number with at most %s decimal places." +msgstr[0] "Ве молам внесете правилен децимален број кој има најмногу %s децимална цифра." +msgstr[1] "Ве молам внесете правилен децимален број кој има најмногу %s децимални цифри." + +#: core/validators.py:458 +msgid "Please enter a valid floating point number." +msgstr "Ве молам внесете правилен децимален број." + +#: core/validators.py:467 +#, python-format +msgid "Make sure your uploaded file is at least %s bytes big." +msgstr "Потврдете дека качената датотека има најмалку %s бајти." + +#: core/validators.py:468 +#, python-format +msgid "Make sure your uploaded file is at most %s bytes big." +msgstr "Потврдете дека качената датотека има најмногу %s бајти." + +#: core/validators.py:485 +msgid "The format for this field is wrong." +msgstr "Форматот за ова поле е грешен." + +#: core/validators.py:500 +msgid "This field is invalid." +msgstr "Ова поле не е правилно." + +#: core/validators.py:536 +#, python-format +msgid "Could not retrieve anything from %s." +msgstr "Неможев да извадам ништо од %s." + +#: core/validators.py:539 +#, python-format +msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'." +msgstr "Адресата %(url)s врати неправилно заглавје Content-Type „%(contenttype)s“." + +#: core/validators.py:572 +#, python-format +msgid "" +"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with " +"\"%(start)s\".)" +msgstr "" +"Ве молам затворете го отворениот %(tag)s таг од линијата %(line)s. (линијата " +"почнува со „%(start)s“.)" + +#: core/validators.py:576 +#, python-format +msgid "" +"Some text starting on line %(line)s is not allowed in that context. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"Некој текст кој почнува на линијата %(line)s не е дозволен во тој контекст. " +"(Линијата започнува со „%(start)s“.)" + +#: core/validators.py:581 +#, python-format +msgid "" +"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"„%(attr)s“ на линија %(line)s е неправилен атрибут. (линијата започнува со „%" +"(start)s“.)" + +#: core/validators.py:586 +#, python-format +msgid "" +"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%" +"(start)s\".)" +msgstr "" +"„<%(tag)s>“ на линија %(line)s е неправилен таг. (линијата започнува со „%" +"(start)s“.)" + +#: core/validators.py:590 +#, python-format +msgid "" +"A tag on line %(line)s is missing one or more required attributes. (Line " +"starts with \"%(start)s\".)" +msgstr "" +"На таг од линијата %(line)s му недостасува еден или повеќе од потребните " +"атрибути (линијата започнува со „%(start)s“)." + +#: core/validators.py:595 +#, python-format +msgid "" +"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line " +"starts with \"%(start)s\".)" +msgstr "Атрибутот „%(attr)s“ на линијата %(line)s има неправилна вредност (линијата започнува со „%(start)s“)." + +#: db/models/manipulators.py:308 +#, python-format +msgid "%(object)s with this %(type)s already exists for the given %(field)s." +msgstr "%(object)s од овој тип %(type)s веќе постои за даденото %(field)s." + +#: db/models/fields/__init__.py:51 +#, python-format +msgid "%(optname)s with this %(fieldname)s already exists." +msgstr "%(optname)s со ова %(fieldname)s веќе постои." + +#: db/models/fields/__init__.py:176 db/models/fields/__init__.py:348 +#: db/models/fields/__init__.py:780 db/models/fields/__init__.py:791 +#: newforms/fields.py:46 oldforms/__init__.py:374 +msgid "This field is required." +msgstr "Ова поле е задолжително." + +#: db/models/fields/__init__.py:448 +msgid "This value must be an integer." +msgstr "Оваа вредност мора да биде цел број." + +#: db/models/fields/__init__.py:487 +msgid "This value must be either True or False." +msgstr "Оваа вредност мора да биде или точно или неточно." + +#: db/models/fields/__init__.py:511 +msgid "This field cannot be null." +msgstr "Оваа вредност неможе да биде null." + +#: db/models/fields/__init__.py:689 +msgid "This value must be a decimal number." +msgstr "Оваа вредност мора да биде децимален број." + +#: db/models/fields/__init__.py:800 +msgid "Enter a valid filename." +msgstr "Внесите правилно име на датотека." + +#: db/models/fields/__init__.py:981 +msgid "This value must be either None, True or False." +msgstr "Оваа вредност мора да биде празна, точно или неточно." + +#: db/models/fields/related.py:94 +#, python-format +msgid "Please enter a valid %s." +msgstr "Ве молам внесете правилно %s." + +#: db/models/fields/related.py:746 +msgid "Separate multiple IDs with commas." +msgstr "Одвојте ги идентификационите броеви со запирки." + +#: db/models/fields/related.py:748 +msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one." +msgstr "Држете го „Control“ или „Command“ на Мекинтош за да изберете повеќе од едно." + +#: db/models/fields/related.py:795 +#, python-format +msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid." +msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid." +msgstr[0] "" +"Ве молам внесете правилен %(self)s идентификацион број. Оваа вредност %" +"(value)r е неправилна." +msgstr[1] "" +"Ве молам внесете правилен %(self)s идентификацион број. Вредностите %(value)" +"r се неправилни." + +#: newforms/fields.py:47 +msgid "Enter a valid value." +msgstr "Внесете правилна вредност." + +#: newforms/fields.py:124 +#, python-format +msgid "Ensure this value has at most %(max)d characters (it has %(length)d)." +msgstr "Осигурајте се дека оваа вредност има најмногу %(max)d знаци (има %(length)d)." + +#: newforms/fields.py:125 +#, python-format +msgid "Ensure this value has at least %(min)d characters (it has %(length)d)." +msgstr "Осигурајте се дека оваа вредност има најмалку %(min)d знаци (има %(length)d)." + +#: newforms/fields.py:153 newforms/fields.py:182 newforms/fields.py:211 +#, python-format +msgid "Ensure this value is less than or equal to %s." +msgstr "Осигурајте се дека оваа вредност е помала или еднаква со %s." + +#: newforms/fields.py:154 newforms/fields.py:183 newforms/fields.py:212 +#, python-format +msgid "Ensure this value is greater than or equal to %s." +msgstr "Осигурајте се дека оваа вредност е поголема или еднаква со %s." + +#: newforms/fields.py:181 newforms/fields.py:210 +msgid "Enter a number." +msgstr "Внесете број." + +#: newforms/fields.py:213 +#, python-format +msgid "Ensure that there are no more than %s digits in total." +msgstr "Осигурајте се дека нема вкупно повеќе од %s цифри." + +#: newforms/fields.py:214 +#, python-format +msgid "Ensure that there are no more than %s decimal places." +msgstr "Осигурајте се дека нема повеќе од %s децимални места." + +#: newforms/fields.py:215 +#, python-format +msgid "Ensure that there are no more than %s digits before the decimal point." +msgstr "Осигурајте се дека нема повеќе од %s цифри пред децималната запирка." + +#: newforms/fields.py:263 newforms/fields.py:750 +msgid "Enter a valid date." +msgstr "Внесете правилен датум." + +#: newforms/fields.py:296 newforms/fields.py:751 +msgid "Enter a valid time." +msgstr "Внесете правилно време." + +#: newforms/fields.py:335 +msgid "Enter a valid date/time." +msgstr "Внесете правилен датум со време." + +#: newforms/fields.py:434 +msgid "No file was submitted." +msgstr "Не беше пратена датотека." + +#: newforms/fields.py:435 oldforms/__init__.py:689 +msgid "The submitted file is empty." +msgstr "Пратената датотека е празна." + +#: newforms/fields.py:497 +msgid "Enter a valid URL." +msgstr "Внесете правилна адреса." + +#: newforms/fields.py:498 +msgid "This URL appears to be a broken link." +msgstr "Оваа адреса изгледа дека не е достапна." + +#: newforms/fields.py:559 newforms/models.py:299 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "Изберете правилно. Тоа не е едно од можните избори." + +#: newforms/fields.py:598 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "Внесете валиден избор. %(value)s не е еден од можните избори." + +#: newforms/fields.py:599 newforms/fields.py:661 newforms/models.py:365 +msgid "Enter a list of values." +msgstr "Внесете листа на вредности." + +#: newforms/fields.py:779 +msgid "Enter a valid IPv4 address." +msgstr "Внесeте правилна IPv4 адреса." + +#: newforms/models.py:366 +#, python-format +msgid "Select a valid choice. %s is not one of the available choices." +msgstr "Внесете правилно. %s не е еден од достапните вредности." + +#: oldforms/__init__.py:409 #, python-format msgid "Ensure your text is less than %s character." msgid_plural "Ensure your text is less than %s characters." msgstr[0] "Осигурајте се дека вашиот текст има помалку од %s знак." msgstr[1] "Осигурајте се дека вашиот текст има помалку од %s знаци." -#: oldforms/__init__.py:397 +#: oldforms/__init__.py:414 msgid "Line breaks are not allowed here." msgstr "Тука не се дозволени прекини на линија." -#: oldforms/__init__.py:498 oldforms/__init__.py:571 oldforms/__init__.py:610 +#: oldforms/__init__.py:512 oldforms/__init__.py:586 oldforms/__init__.py:625 #, python-format msgid "Select a valid choice; '%(data)s' is not in %(choices)s." msgstr "Изберете правилно, %(data)s' не е во %(choices)s." -#: oldforms/__init__.py:674 -msgid "The submitted file is empty." -msgstr "Пратената датотека е празна." - -#: oldforms/__init__.py:730 +#: oldforms/__init__.py:745 msgid "Enter a whole number between -32,768 and 32,767." msgstr "Внесете цел број помеѓу -32,768 и 32,767." -#: oldforms/__init__.py:740 +#: oldforms/__init__.py:755 msgid "Enter a positive number." msgstr "Внесете позитивен број." -#: oldforms/__init__.py:750 +#: oldforms/__init__.py:765 msgid "Enter a whole number between 0 and 32,767." msgstr "Внесете цел број помеѓу 0 и 32,767." -#: views/generic/create_update.py:43 -#, python-format -msgid "The %(verbose_name)s was created successfully." -msgstr "%(verbose_name)s беше успешно создаден." +#: template/defaultfilters.py:698 +msgid "yes,no,maybe" +msgstr "да, не, можеби" -#: views/generic/create_update.py:117 +#: template/defaultfilters.py:729 #, python-format -msgid "The %(verbose_name)s was updated successfully." -msgstr "%(verbose_name)s беше успешно ажуриран." +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d бајт" +msgstr[1] "%(size)d бајти" -#: views/generic/create_update.py:184 +#: template/defaultfilters.py:731 #, python-format -msgid "The %(verbose_name)s was deleted." -msgstr "%(verbose_name)s беше избришан." +msgid "%.1f KB" +msgstr "%.1f КБ" + +#: template/defaultfilters.py:733 +#, python-format +msgid "%.1f MB" +msgstr "%.1f МБ" + +#: template/defaultfilters.py:734 +#, python-format +msgid "%.1f GB" +msgstr "%.1f ГБ" + +#: utils/dateformat.py:41 +msgid "p.m." +msgstr "попладне" + +#: utils/dateformat.py:42 +msgid "a.m." +msgstr "наутро" + +#: utils/dateformat.py:47 +msgid "PM" +msgstr "попладне" + +#: utils/dateformat.py:48 +msgid "AM" +msgstr "наутро" + +#: utils/dateformat.py:97 +msgid "midnight" +msgstr "полноќ" + +#: utils/dateformat.py:99 +msgid "noon" +msgstr "пладне" #: utils/dates.py:6 msgid "Monday" @@ -2488,268 +4110,244 @@ msgstr "сабота" msgid "Sunday" msgstr "недела" -#: utils/dates.py:14 +#: utils/dates.py:10 +msgid "Mon" +msgstr "пон" + +#: utils/dates.py:10 +msgid "Tue" +msgstr "вто" + +#: utils/dates.py:10 +msgid "Wed" +msgstr "сре" + +#: utils/dates.py:10 +msgid "Thu" +msgstr "чет" + +#: utils/dates.py:10 +msgid "Fri" +msgstr "пет" + +#: utils/dates.py:11 +msgid "Sat" +msgstr "саб" + +#: utils/dates.py:11 +msgid "Sun" +msgstr "нед" + +#: utils/dates.py:18 msgid "January" msgstr "јануари" -#: utils/dates.py:14 +#: utils/dates.py:18 msgid "February" msgstr "февруари" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:18 utils/dates.py:31 msgid "March" msgstr "март" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:18 utils/dates.py:31 msgid "April" msgstr "април" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:18 utils/dates.py:31 msgid "May" msgstr "мај" -#: utils/dates.py:14 utils/dates.py:27 +#: utils/dates.py:18 utils/dates.py:31 msgid "June" msgstr "јуни" -#: utils/dates.py:15 utils/dates.py:27 +#: utils/dates.py:19 utils/dates.py:31 msgid "July" msgstr "јули" -#: utils/dates.py:15 +#: utils/dates.py:19 msgid "August" msgstr "август" -#: utils/dates.py:15 +#: utils/dates.py:19 msgid "September" msgstr "септември" -#: utils/dates.py:15 +#: utils/dates.py:19 msgid "October" msgstr "октомври" -#: utils/dates.py:15 +#: utils/dates.py:19 msgid "November" msgstr "ноември" -#: utils/dates.py:16 +#: utils/dates.py:20 msgid "December" msgstr "декември" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "jan" msgstr "јан" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "feb" msgstr "фев" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "mar" msgstr "мар" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "apr" msgstr "апр" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "may" msgstr "мај" -#: utils/dates.py:19 +#: utils/dates.py:23 msgid "jun" msgstr "јун" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "jul" msgstr "јул" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "aug" msgstr "авг" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "sep" msgstr "сеп" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "oct" msgstr "окт" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "nov" msgstr "ное" -#: utils/dates.py:20 +#: utils/dates.py:24 msgid "dec" msgstr "дек" -#: utils/dates.py:27 +#: utils/dates.py:31 msgid "Jan." msgstr "јан." -#: utils/dates.py:27 +#: utils/dates.py:31 msgid "Feb." msgstr "фев." -#: utils/dates.py:28 +#: utils/dates.py:32 msgid "Aug." msgstr "авг." -#: utils/dates.py:28 +#: utils/dates.py:32 msgid "Sept." msgstr "сеп." -#: utils/dates.py:28 +#: utils/dates.py:32 msgid "Oct." msgstr "окт." -#: utils/dates.py:28 +#: utils/dates.py:32 msgid "Nov." msgstr "ное." -#: utils/dates.py:28 +#: utils/dates.py:32 msgid "Dec." msgstr "дек." -#: utils/timesince.py:12 +#: utils/text.py:127 +msgid "or" +msgstr "или" + +#: utils/timesince.py:21 msgid "year" msgid_plural "years" msgstr[0] "година" msgstr[1] "години" -#: utils/timesince.py:13 +#: utils/timesince.py:22 msgid "month" msgid_plural "months" msgstr[0] "месец" msgstr[1] "месеци" -#: utils/timesince.py:14 +#: utils/timesince.py:23 msgid "week" msgid_plural "weeks" msgstr[0] "седмица" msgstr[1] "седмици" -#: utils/timesince.py:15 +#: utils/timesince.py:24 msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дена" -#: utils/timesince.py:16 +#: utils/timesince.py:25 msgid "hour" msgid_plural "hours" msgstr[0] "час" msgstr[1] "часа" -#: utils/timesince.py:17 +#: utils/timesince.py:26 msgid "minute" msgid_plural "minutes" msgstr[0] "минута" msgstr[1] "минути" -#: utils/dateformat.py:40 -msgid "p.m." -msgstr "попладне" +#: utils/timesince.py:46 +msgid "minutes" +msgstr "минути" -#: utils/dateformat.py:41 -msgid "a.m." -msgstr "наутро" +#: utils/timesince.py:51 +#, python-format +msgid "%(number)d %(type)s" +msgstr "%(number)d %(type)s" -#: utils/dateformat.py:46 -msgid "PM" -msgstr "попладне" +#: utils/timesince.py:57 +#, python-format +msgid ", %(number)d %(type)s" +msgstr ", %(number)d %(type)s" -#: utils/dateformat.py:47 -msgid "AM" -msgstr "наутро" - -#: utils/dateformat.py:95 -msgid "midnight" -msgstr "полноќ" - -#: utils/dateformat.py:97 -msgid "noon" -msgstr "пладне" - -#: utils/translation/trans_real.py:358 +#: utils/translation/trans_real.py:403 msgid "DATE_FORMAT" msgstr "j M Y" -#: utils/translation/trans_real.py:359 +#: utils/translation/trans_real.py:404 msgid "DATETIME_FORMAT" msgstr "j M Y, P" -#: utils/translation/trans_real.py:360 +#: utils/translation/trans_real.py:405 msgid "TIME_FORMAT" msgstr "P" -#: utils/translation/trans_real.py:376 +#: utils/translation/trans_real.py:421 msgid "YEAR_MONTH_FORMAT" msgstr "F Y" -#: utils/translation/trans_real.py:377 +#: utils/translation/trans_real.py:422 msgid "MONTH_DAY_FORMAT" msgstr "F j" -#: template/defaultfilters.py:491 -msgid "yes,no,maybe" -msgstr "да, не, можеби" - -#: newforms/fields.py:103 newforms/fields.py:256 +#: views/generic/create_update.py:43 #, python-format -msgid "Ensure this value has at most %d characters." -msgstr "Осигурајте се дека оваа вредност има најмногу %d знаци." +msgid "The %(verbose_name)s was created successfully." +msgstr "%(verbose_name)s беше успешно создаден." -#: newforms/fields.py:105 newforms/fields.py:258 +#: views/generic/create_update.py:117 #, python-format -msgid "Ensure this value has at least %d characters." -msgstr "Осигурајте се дека оваа вредност има најмалку %d знаци." +msgid "The %(verbose_name)s was updated successfully." +msgstr "%(verbose_name)s беше успешно ажуриран." -#: newforms/fields.py:130 +#: views/generic/create_update.py:184 #, python-format -msgid "Ensure this value is less than or equal to %s." -msgstr "Осигурајте се дека оваа вредност е помала или еднаква на %s." - -#: newforms/fields.py:132 -#, python-format -msgid "Ensure this value is greater than or equal to %s." -msgstr "Осигурајте се дека оваа вредност е поголема или еднаква со %s." - -#: newforms/fields.py:165 -msgid "Enter a valid date." -msgstr "Внесете правилен датум." - -#: newforms/fields.py:192 -msgid "Enter a valid time." -msgstr "Внесете правилно време." - -#: newforms/fields.py:228 -msgid "Enter a valid date/time." -msgstr "Внесете правилен датум со време." - -#: newforms/fields.py:242 -msgid "Enter a valid value." -msgstr "Внесете правилна вредност." - -#: newforms/fields.py:289 newforms/fields.py:311 -msgid "Enter a valid URL." -msgstr "Внесете правилна адреса." - -#: newforms/fields.py:313 -msgid "This URL appears to be a broken link." -msgstr "Оваа адреса изгледа дека не е достапна." - -#: newforms/fields.py:362 newforms/models.py:165 -msgid "Select a valid choice. That choice is not one of the available choices." -msgstr "Изберете правилно. Тоа не е едно од можните избори." - -#: newforms/fields.py:380 newforms/fields.py:456 newforms/models.py:182 -msgid "Enter a list of values." -msgstr "Внесете листа на вредности." - -#: newforms/fields.py:389 newforms/models.py:188 -#, python-format -msgid "Select a valid choice. %s is not one of the available choices." -msgstr "Внесете правилно. %s не е еден од достапните вредности." +msgid "The %(verbose_name)s was deleted." +msgstr "%(verbose_name)s беше избришан." diff --git a/django/contrib/auth/admin.py b/django/contrib/auth/admin.py index aba2220248..998692a6cb 100644 --- a/django/contrib/auth/admin.py +++ b/django/contrib/auth/admin.py @@ -8,6 +8,7 @@ from django.contrib import admin class GroupAdmin(admin.ModelAdmin): search_fields = ('name',) + ordering = ('name',) filter_horizontal = ('permissions',) class UserAdmin(admin.ModelAdmin): @@ -21,6 +22,7 @@ class UserAdmin(admin.ModelAdmin): list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff') list_filter = ('is_staff', 'is_superuser') search_fields = ('username', 'first_name', 'last_name', 'email') + ordering = ('username',) filter_horizontal = ('user_permissions',) def add_view(self, request): diff --git a/django/contrib/auth/fixtures/authtestdata.json b/django/contrib/auth/fixtures/authtestdata.json new file mode 100644 index 0000000000..e0bdc24e72 --- /dev/null +++ b/django/contrib/auth/fixtures/authtestdata.json @@ -0,0 +1,56 @@ +[ + { + "pk": "1", + "model": "auth.user", + "fields": { + "username": "testclient", + "first_name": "Test", + "last_name": "Client", + "is_active": true, + "is_superuser": false, + "is_staff": false, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "testclient@example.com", + "date_joined": "2006-12-17 07:03:31" + } + }, + { + "pk": "2", + "model": "auth.user", + "fields": { + "username": "inactive", + "first_name": "Inactive", + "last_name": "User", + "is_active": false, + "is_superuser": false, + "is_staff": false, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "testclient@example.com", + "date_joined": "2006-12-17 07:03:31" + } + }, + { + "pk": "3", + "model": "auth.user", + "fields": { + "username": "staff", + "first_name": "Staff", + "last_name": "Member", + "is_active": true, + "is_superuser": false, + "is_staff": true, + "last_login": "2006-12-17 07:03:31", + "groups": [], + "user_permissions": [], + "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161", + "email": "staffmember@example.com", + "date_joined": "2006-12-17 07:03:31" + } + } +] diff --git a/django/contrib/auth/models.py b/django/contrib/auth/models.py index 56b4cbc082..83bdb95dab 100644 --- a/django/contrib/auth/models.py +++ b/django/contrib/auth/models.py @@ -96,8 +96,7 @@ class Group(models.Model): class Meta: verbose_name = _('group') verbose_name_plural = _('groups') - ordering = ('name',) - + def __unicode__(self): return self.name @@ -150,8 +149,7 @@ class User(models.Model): class Meta: verbose_name = _('user') verbose_name_plural = _('users') - ordering = ('username',) - + def __unicode__(self): return self.username diff --git a/django/contrib/auth/tests/__init__.py b/django/contrib/auth/tests/__init__.py index 092fdd5d58..6242303f46 100644 --- a/django/contrib/auth/tests/__init__.py +++ b/django/contrib/auth/tests/__init__.py @@ -1,8 +1,8 @@ -from django.contrib.auth.tests.basic import BASIC_TESTS -from django.contrib.auth.tests.forms import FORM_TESTS, PasswordResetFormTestCase +from django.contrib.auth.tests.basic import BASIC_TESTS, PasswordResetTest +from django.contrib.auth.tests.forms import FORM_TESTS __test__ = { 'BASIC_TESTS': BASIC_TESTS, - 'PASSWORDRESET_TESTS': PasswordResetFormTestCase, + 'PASSWORDRESET_TESTS': PasswordResetTest, 'FORM_TESTS': FORM_TESTS, } diff --git a/django/contrib/auth/tests/basic.py b/django/contrib/auth/tests/basic.py index 8667ca9e5a..76dbdc9cb9 100644 --- a/django/contrib/auth/tests/basic.py +++ b/django/contrib/auth/tests/basic.py @@ -53,4 +53,25 @@ Superuser created successfully. u'joe@somewhere.org' >>> u.password u'!' -""" \ No newline at end of file +""" + +from django.test import TestCase +from django.core import mail + +class PasswordResetTest(TestCase): + fixtures = ['authtestdata.json'] + urls = 'django.contrib.auth.urls' + + def test_email_not_found(self): + "Error is raised if the provided email address isn't currently registered" + response = self.client.get('/password_reset/') + self.assertEquals(response.status_code, 200) + response = self.client.post('/password_reset/', {'email': 'not_a_real_email@email.com'}) + self.assertContains(response, "That e-mail address doesn't have an associated user account") + self.assertEquals(len(mail.outbox), 0) + + def test_email_found(self): + "Email is sent if a valid email address is provided for password reset" + response = self.client.post('/password_reset/', {'email': 'staffmember@example.com'}) + self.assertEquals(response.status_code, 302) + self.assertEquals(len(mail.outbox), 1) diff --git a/django/contrib/auth/tests/forms.py b/django/contrib/auth/tests/forms.py index 001323bf34..1e1e0a95d4 100644 --- a/django/contrib/auth/tests/forms.py +++ b/django/contrib/auth/tests/forms.py @@ -1,33 +1,4 @@ -from django.core import mail -from django.test import TestCase -from django.contrib.auth.models import User -from django.contrib.auth.forms import PasswordResetForm - -class PasswordResetFormTestCase(TestCase): - def testValidUser(self): - data = { - 'email': 'nonexistent@example.com', - } - form = PasswordResetForm(data) - self.assertEqual(form.is_valid(), False) - self.assertEqual(form["email"].errors, [u"That e-mail address doesn't have an associated user account. Are you sure you've registered?"]) - - def testEmail(self): - # TODO: remove my email address from the test ;) - User.objects.create_user('atestuser', 'atestuser@example.com', 'test789') - data = { - 'email': 'atestuser@example.com', - } - form = PasswordResetForm(data) - self.assertEqual(form.is_valid(), True) - # TODO: look at why using contrib.sites breaks other tests - form.save(domain_override="example.com") - self.assertEqual(len(mail.outbox), 1) - self.assertEqual(mail.outbox[0].subject, u'Password reset on example.com') - # TODO: test mail body. need to figure out a way to get the password in plain text - # self.assertEqual(mail.outbox[0].body, '') - FORM_TESTS = """ >>> from django.contrib.auth.models import User >>> from django.contrib.auth.forms import UserCreationForm, AuthenticationForm diff --git a/django/contrib/auth/urls.py b/django/contrib/auth/urls.py new file mode 100644 index 0000000000..5ddfcf15e8 --- /dev/null +++ b/django/contrib/auth/urls.py @@ -0,0 +1,13 @@ +# These URLs are normally mapped to /admin/urls.py. This URLs file is +# provided as a convenience to those who want to deploy these URLs elsewhere. +# This file is also used to provide a reliable view deployment for test purposes. + +from django.conf.urls.defaults import * + +urlpatterns = patterns('', + ('^logout/$', 'django.contrib.auth.views.logout'), + ('^password_change/$', 'django.contrib.auth.views.password_change'), + ('^password_change/done/$', 'django.contrib.auth.views.password_change_done'), + ('^password_reset/$', 'django.contrib.auth.views.password_reset') +) + diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py index 2b62d38e07..11ccf43b02 100644 --- a/django/contrib/flatpages/models.py +++ b/django/contrib/flatpages/models.py @@ -8,7 +8,7 @@ class FlatPage(models.Model): url = models.CharField(_('URL'), max_length=100, validator_list=[validators.isAlphaNumericURL], db_index=True, help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes.")) title = models.CharField(_('title'), max_length=200) - content = models.TextField(_('content')) + content = models.TextField(_('content'), blank=True) enable_comments = models.BooleanField(_('enable comments')) template_name = models.CharField(_('template name'), max_length=70, blank=True, help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'.")) diff --git a/django/contrib/formtools/tests.py b/django/contrib/formtools/tests.py index 143857ad58..ba241e9dc6 100644 --- a/django/contrib/formtools/tests.py +++ b/django/contrib/formtools/tests.py @@ -21,18 +21,14 @@ class TestForm(forms.Form): class PreviewTests(TestCase): + urls = 'django.contrib.formtools.test_urls' def setUp(self): - self._old_root_urlconf = settings.ROOT_URLCONF - settings.ROOT_URLCONF = 'django.contrib.formtools.test_urls' # Create a FormPreview instance to share between tests self.preview = preview.FormPreview(TestForm) input_template = '' self.input = input_template % (self.preview.unused_name('stage'), "%d") - def tearDown(self): - settings.ROOT_URLCONF = self._old_root_urlconf - def test_unused_name(self): """ Verifies name mangling to get uniue field name. diff --git a/django/core/management/commands/createcachetable.py b/django/core/management/commands/createcachetable.py index c8df8d04f7..098bca793f 100644 --- a/django/core/management/commands/createcachetable.py +++ b/django/core/management/commands/createcachetable.py @@ -21,10 +21,10 @@ class Command(LabelCommand): for f in fields: field_output = [qn(f.name), f.db_type()] field_output.append("%sNULL" % (not f.null and "NOT " or "")) - if f.unique: - field_output.append("UNIQUE") if f.primary_key: field_output.append("PRIMARY KEY") + elif f.unique: + field_output.append("UNIQUE") if f.db_index: unique = f.unique and "UNIQUE " or "" index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \ diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py index 688cd58e2c..0ccc38ba8d 100644 --- a/django/core/management/commands/loaddata.py +++ b/django/core/management/commands/loaddata.py @@ -162,3 +162,9 @@ class Command(BaseCommand): else: if verbosity > 0: print "Installed %d object(s) from %d fixture(s)" % (object_count, fixture_count) + + # Close the DB connection. This is required as a workaround for an + # edge case in MySQL: if the same connection is used to + # create tables, load data, and query, the query can return + # incorrect results. See Django #7572, MySQL #37735. + connection.close() diff --git a/django/core/management/sql.py b/django/core/management/sql.py index c635fcab8a..000886ada5 100644 --- a/django/core/management/sql.py +++ b/django/core/management/sql.py @@ -268,11 +268,11 @@ def sql_model_create(model, style, known_models=set()): field_output = [style.SQL_FIELD(qn(f.column)), style.SQL_COLTYPE(col_type)] field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or ''))) - if f.unique and (not f.primary_key or connection.features.allows_unique_and_pk): - field_output.append(style.SQL_KEYWORD('UNIQUE')) if f.primary_key: field_output.append(style.SQL_KEYWORD('PRIMARY KEY')) - if tablespace and connection.features.supports_tablespaces and (f.unique or f.primary_key) and connection.features.autoindexes_primary_keys: + elif f.unique: + field_output.append(style.SQL_KEYWORD('UNIQUE')) + if tablespace and connection.features.supports_tablespaces and f.unique: # We must specify the index tablespace inline, because we # won't be generating a CREATE INDEX statement for this field. field_output.append(connection.ops.tablespace_sql(tablespace, inline=True)) @@ -355,7 +355,7 @@ def many_to_many_sql_for_model(model, style): for f in opts.local_many_to_many: if not isinstance(f.rel, generic.GenericRel): tablespace = f.db_tablespace or opts.db_tablespace - if tablespace and connection.features.supports_tablespaces and connection.features.autoindexes_primary_keys: + if tablespace and connection.features.supports_tablespaces: tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace, inline=True) else: tablespace_sql = '' @@ -460,15 +460,14 @@ def sql_indexes_for_model(model, style): qn = connection.ops.quote_name for f in model._meta.local_fields: - if f.db_index and not ((f.primary_key or f.unique) and connection.features.autoindexes_primary_keys): - unique = f.unique and 'UNIQUE ' or '' + if f.db_index and not f.unique: tablespace = f.db_tablespace or model._meta.db_tablespace if tablespace and connection.features.supports_tablespaces: tablespace_sql = ' ' + connection.ops.tablespace_sql(tablespace) else: tablespace_sql = '' output.append( - style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \ + style.SQL_KEYWORD('CREATE INDEX') + ' ' + \ style.SQL_TABLE(qn('%s_%s' % (model._meta.db_table, f.column))) + ' ' + \ style.SQL_KEYWORD('ON') + ' ' + \ style.SQL_TABLE(qn(model._meta.db_table)) + ' ' + \ diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 5bdf08b8ca..f88f8c70bb 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -551,6 +551,9 @@ class WSGIRequestHandler(BaseHTTPRequestHandler): def __init__(self, *args, **kwargs): from django.conf import settings self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX + # We set self.path to avoid crashes in log_message() on unsupported + # requests (like "OPTIONS"). + self.path = '' BaseHTTPRequestHandler.__init__(self, *args, **kwargs) def get_environ(self): diff --git a/django/core/servers/fastcgi.py b/django/core/servers/fastcgi.py index d7145e15ec..dc4c35b08d 100644 --- a/django/core/servers/fastcgi.py +++ b/django/core/servers/fastcgi.py @@ -40,6 +40,7 @@ Optional Fcgi settings: (setting=value) workdir=DIRECTORY change to this directory when daemonizing. outlog=FILE write stdout to this file. errlog=FILE write stderr to this file. + umask=UMASK umask to use when daemonizing (default 022). Examples: Run a "standard" fastcgi process on a file-descriptor @@ -73,6 +74,7 @@ FASTCGI_OPTIONS = { 'maxrequests': 0, 'outlog': None, 'errlog': None, + 'umask': None, } def fastcgi_help(message=None): @@ -159,6 +161,8 @@ def runfastcgi(argset=[], **kwargs): daemon_kwargs['out_log'] = options['outlog'] if options['errlog']: daemon_kwargs['err_log'] = options['errlog'] + if options['umask']: + daemon_kwargs['umask'] = int(options['umask']) if daemonize: from django.utils.daemonize import become_daemon diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 2ad63bfc7d..ff0bcbcfea 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -296,3 +296,8 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None): kwargs = kwargs or {} return iri_to_uri(u'/' + get_resolver(urlconf).reverse(viewname, *args, **kwargs)) +def clear_url_caches(): + global _resolver_cache + global _callable_cache + _resolver_cache.clear() + _callable_cache.clear() diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py index 7a4e46a7d7..36a2339638 100644 --- a/django/db/backends/__init__.py +++ b/django/db/backends/__init__.py @@ -41,8 +41,6 @@ class BaseDatabaseWrapper(local): class BaseDatabaseFeatures(object): allows_group_by_ordinal = True - allows_unique_and_pk = True - autoindexes_primary_keys = True inline_fk_references = True needs_datetime_string_cast = True supports_constraints = True diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index 23735a023b..336ad89504 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -60,7 +60,6 @@ server_version_re = re.compile(r'(\d{1,2})\.(\d{1,2})\.(\d{1,2})') # TRADITIONAL will automatically cause most warnings to be treated as errors. class DatabaseFeatures(BaseDatabaseFeatures): - autoindexes_primary_keys = False inline_fk_references = False empty_fetchmany_value = () update_can_self_select = False @@ -136,7 +135,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): features = DatabaseFeatures() ops = DatabaseOperations() operators = { - 'exact': '= %s', + 'exact': '= BINARY %s', 'iexact': 'LIKE %s', 'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s', diff --git a/django/db/backends/mysql_old/base.py b/django/db/backends/mysql_old/base.py index e57aee6a04..48b6b6958a 100644 --- a/django/db/backends/mysql_old/base.py +++ b/django/db/backends/mysql_old/base.py @@ -64,7 +64,6 @@ class MysqlDebugWrapper: return getattr(self.cursor, attr) class DatabaseFeatures(BaseDatabaseFeatures): - autoindexes_primary_keys = False inline_fk_references = False empty_fetchmany_value = () update_can_self_select = False @@ -140,7 +139,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): features = DatabaseFeatures() ops = DatabaseOperations() operators = { - 'exact': '= %s', + 'exact': '= BINARY %s', 'iexact': 'LIKE %s', 'contains': 'LIKE BINARY %s', 'icontains': 'LIKE %s', diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 1df6bac069..54517662c1 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -24,7 +24,6 @@ IntegrityError = Database.IntegrityError class DatabaseFeatures(BaseDatabaseFeatures): allows_group_by_ordinal = False - allows_unique_and_pk = False # Suppress UNIQUE/PK for Oracle (ORA-02259) empty_fetchmany_value = () needs_datetime_string_cast = False supports_tablespaces = True diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index 219686789f..2652aecfc7 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -23,7 +23,7 @@ DATA_TYPES = { 'ImageField': 'NVARCHAR2(%(max_length)s)', 'IntegerField': 'NUMBER(11)', 'IPAddressField': 'VARCHAR2(15)', - 'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(column)s IS NULL))', + 'NullBooleanField': 'NUMBER(1) CHECK ((%(qn_column)s IN (0,1)) OR (%(qn_column)s IS NULL))', 'OneToOneField': 'NUMBER(11)', 'PhoneNumberField': 'VARCHAR2(20)', 'PositiveIntegerField': 'NUMBER(11) CHECK (%(qn_column)s >= 0)', diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py index 7e27b23f72..ba6e3235c2 100644 --- a/django/db/backends/postgresql/operations.py +++ b/django/db/backends/postgresql/operations.py @@ -97,7 +97,7 @@ class DatabaseOperations(BaseDatabaseOperations): # Use `coalesce` to set the sequence for each model to the max pk value if there are records, # or 1 if there are none. Set the `is_called` property (the third argument to `setval`) to true # if there are records (as the max pk value is already in use), otherwise set it to false. - for f in model._meta.fields: + for f in model._meta.local_fields: if isinstance(f, models.AutoField): output.append("%s setval('%s', coalesce(max(%s), 1), max(%s) %s null) %s %s;" % \ (style.SQL_KEYWORD('SELECT'), diff --git a/django/db/models/base.py b/django/db/models/base.py index d7e2c299cc..12019f23df 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -50,7 +50,15 @@ class ModelBase(type): meta = attr_meta base_meta = getattr(new_class, '_meta', None) - new_class.add_to_class('_meta', Options(meta)) + if getattr(meta, 'app_label', None) is None: + # Figure out the app_label by looking one level up. + # For 'django.contrib.sites.models', this would be 'sites'. + model_module = sys.modules[new_class.__module__] + kwargs = {"app_label": model_module.__name__.split('.')[-2]} + else: + kwargs = {} + + new_class.add_to_class('_meta', Options(meta, **kwargs)) if not abstract: new_class.add_to_class('DoesNotExist', subclass_exception('DoesNotExist', ObjectDoesNotExist, module)) @@ -71,11 +79,6 @@ class ModelBase(type): if new_class._default_manager.model._meta.abstract: old_default_mgr = new_class._default_manager new_class._default_manager = None - if getattr(new_class._meta, 'app_label', None) is None: - # Figure out the app_label by looking one level up. - # For 'django.contrib.sites.models', this would be 'sites'. - model_module = sys.modules[new_class.__module__] - new_class._meta.app_label = model_module.__name__.split('.')[-2] # Bail out early if we have already created this class. m = get_model(new_class._meta.app_label, name, False) @@ -389,6 +392,21 @@ class Model(object): for sub_obj in getattr(self, rel_opts_name).all(): sub_obj._collect_sub_objects(seen_objs, self.__class__, related.field.null) + # Handle any ancestors (for the model-inheritance case). We do this by + # traversing to the most remote parent classes -- those with no parents + # themselves -- and then adding those instances to the collection. That + # will include all the child instances down to "self". + parent_stack = self._meta.parents.values() + while parent_stack: + link = parent_stack.pop() + parent_obj = getattr(self, link.name) + if parent_obj._meta.parents: + parent_stack.extend(parent_obj._meta.parents.values()) + continue + # At this point, parent_obj is base class (no ancestor models). So + # delete it and all its descendents. + parent_obj._collect_sub_objects(seen_objs) + def delete(self): assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname) @@ -436,7 +454,7 @@ class Model(object): def _get_FIELD_filename(self, field): if getattr(self, field.attname): # value is not blank - return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname)) + return os.path.normpath(os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname))) return '' def _get_FIELD_url(self, field): diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index d906d5bdda..8b58e69db1 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -85,7 +85,7 @@ class Field(object): self.name = name self.verbose_name = verbose_name self.primary_key = primary_key - self.max_length, self.unique = max_length, unique + self.max_length, self._unique = max_length, unique self.blank, self.null = blank, null # Oracle treats the empty string ('') as null, so coerce the null # option whenever '' is a possible value. @@ -160,6 +160,10 @@ class Field(object): except KeyError: return None + def unique(self): + return self._unique or self.primary_key + unique = property(unique) + def validate_full(self, field_data, all_data): """ Returns a list of errors for this field. This is the main interface, @@ -676,7 +680,7 @@ class DecimalField(Field): _("This value must be a decimal number.")) def _format(self, value): - if isinstance(value, basestring): + if isinstance(value, basestring) or value is None: return value else: return self.format_number(value) @@ -697,8 +701,7 @@ class DecimalField(Field): return u"%.*f" % (self.decimal_places, value) def get_db_prep_save(self, value): - if value is not None: - value = self._format(value) + value = self._format(value) return super(DecimalField, self).get_db_prep_save(value) def get_db_prep_lookup(self, lookup_type, value): @@ -1151,12 +1154,3 @@ class XMLField(TextField): def get_manipulator_field_objs(self): return [curry(oldforms.XMLLargeTextField, schema_path=self.schema_path)] -class OrderingField(IntegerField): - empty_strings_allowed=False - def __init__(self, with_respect_to, **kwargs): - self.wrt = with_respect_to - kwargs['null'] = True - IntegerField.__init__(self, **kwargs ) - - def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): - return [oldforms.HiddenField(name_prefix + self.name)] diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 5ae94e02de..594236b4c6 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -185,11 +185,11 @@ class SingleRelatedObjectDescriptor(object): def __set__(self, instance, value): if instance is None: raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name - - # The similarity of the code below to the code in + + # The similarity of the code below to the code in # ReverseSingleRelatedObjectDescriptor is annoying, but there's a bunch # of small differences that would make a common base class convoluted. - + # If null=True, we can assign null here, but otherwise the value needs # to be an instance of the related class. if value is None and self.related.field.null == False: @@ -197,14 +197,14 @@ class SingleRelatedObjectDescriptor(object): (instance._meta.object_name, self.related.get_accessor_name())) elif value is not None and not isinstance(value, self.related.model): raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' % - (value, instance._meta.object_name, + (value, instance._meta.object_name, self.related.get_accessor_name(), self.related.opts.object_name)) - + # Set the value of the related field setattr(value, self.related.field.rel.get_related_field().attname, instance) # Since we already know what the related object is, seed the related - # object caches now, too. This avoids another db hit if you get the + # object caches now, too. This avoids another db hit if you get the # object you just set. setattr(instance, self.cache_name, value) setattr(value, self.related.field.get_cache_name(), instance) @@ -243,7 +243,7 @@ class ReverseSingleRelatedObjectDescriptor(object): def __set__(self, instance, value): if instance is None: raise AttributeError, "%s must be accessed via instance" % self._field.name - + # If null=True, we can assign null here, but otherwise the value needs # to be an instance of the related class. if value is None and self.field.null == False: @@ -251,9 +251,9 @@ class ReverseSingleRelatedObjectDescriptor(object): (instance._meta.object_name, self.field.name)) elif value is not None and not isinstance(value, self.field.rel.to): raise ValueError('Cannot assign "%r": "%s.%s" must be a "%s" instance.' % - (value, instance._meta.object_name, + (value, instance._meta.object_name, self.field.name, self.field.rel.to._meta.object_name)) - + # Set the value of the related field try: val = getattr(value, self.field.rel.get_related_field().attname) @@ -262,7 +262,7 @@ class ReverseSingleRelatedObjectDescriptor(object): setattr(instance, self.field.attname, val) # Since we already know what the related object is, seed the related - # object cache now, too. This avoids another db hit if you get the + # object cache now, too. This avoids another db hit if you get the # object you just set. setattr(instance, self.field.get_cache_name(), value) @@ -322,7 +322,9 @@ class ForeignRelatedObjectsDescriptor(object): clear.alters_data = True manager = RelatedManager() - manager.core_filters = {'%s__pk' % rel_field.name: getattr(instance, rel_field.rel.get_related_field().attname)} + attname = rel_field.rel.get_related_field().name + manager.core_filters = {'%s__%s' % (rel_field.name, attname): + getattr(instance, attname)} manager.model = self.related.model return manager @@ -670,6 +672,11 @@ class ForeignKey(RelatedField, Field): def contribute_to_class(self, cls, name): super(ForeignKey, self).contribute_to_class(cls, name) setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self)) + if isinstance(self.rel.to, basestring): + target = self.rel.to + else: + target = self.rel.to._meta.db_table + cls._meta.duplicate_targets[self.column] = (target, "o2m") def contribute_to_related_class(self, cls, related): setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related)) @@ -791,6 +798,12 @@ class ManyToManyField(RelatedField, Field): # Set up the accessor for the m2m table name for the relation self.m2m_db_table = curry(self._get_m2m_db_table, cls._meta) + if isinstance(self.rel.to, basestring): + target = self.rel.to + else: + target = self.rel.to._meta.db_table + cls._meta.duplicate_targets[self.column] = (target, "m2m") + def contribute_to_related_class(self, cls, related): # m2m relations to self do not have a ManyRelatedObjectsDescriptor, # as it would be redundant - unless the field is non-symmetrical. diff --git a/django/db/models/options.py b/django/db/models/options.py index 1ac24fb311..ffea6d5082 100644 --- a/django/db/models/options.py +++ b/django/db/models/options.py @@ -24,7 +24,7 @@ DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering', 'abstract') class Options(object): - def __init__(self, meta): + def __init__(self, meta, app_label=None): self.local_fields, self.local_many_to_many = [], [] self.module_name, self.verbose_name = None, None self.verbose_name_plural = None @@ -32,7 +32,7 @@ class Options(object): self.ordering = [] self.unique_together = [] self.permissions = [] - self.object_name, self.app_label = None, None + self.object_name, self.app_label = None, app_label self.get_latest_by = None self.order_with_respect_to = None self.db_tablespace = settings.DEFAULT_TABLESPACE @@ -43,8 +43,12 @@ class Options(object): self.one_to_one_field = None self.abstract = False self.parents = SortedDict() + self.duplicate_targets = {} def contribute_to_class(self, cls, name): + from django.db import connection + from django.db.backends.util import truncate_name + cls._meta = self self.installed = re.sub('\.models$', '', cls.__module__) in settings.INSTALLED_APPS # First, construct the default values for these options. @@ -86,9 +90,13 @@ class Options(object): self.verbose_name_plural = string_concat(self.verbose_name, 's') del self.meta + # If the db_table wasn't provided, use the app_label + module_name. + if not self.db_table: + self.db_table = "%s_%s" % (self.app_label, self.module_name) + self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) + + def _prepare(self, model): - from django.db import connection - from django.db.backends.util import truncate_name if self.order_with_respect_to: self.order_with_respect_to = self.get_field(self.order_with_respect_to) self.ordering = ('_order',) @@ -107,10 +115,23 @@ class Options(object): auto_created=True) model.add_to_class('id', auto) - # If the db_table wasn't provided, use the app_label + module_name. - if not self.db_table: - self.db_table = "%s_%s" % (self.app_label, self.module_name) - self.db_table = truncate_name(self.db_table, connection.ops.max_name_length()) + # Determine any sets of fields that are pointing to the same targets + # (e.g. two ForeignKeys to the same remote model). The query + # construction code needs to know this. At the end of this, + # self.duplicate_targets will map each duplicate field column to the + # columns it duplicates. + collections = {} + for column, target in self.duplicate_targets.iteritems(): + try: + collections[target].add(column) + except KeyError: + collections[target] = set([column]) + self.duplicate_targets = {} + for elt in collections.itervalues(): + if len(elt) == 1: + continue + for column in elt: + self.duplicate_targets[column] = elt.difference(set([column])) def add_field(self, field): # Insert the given field in the order in which it was created, using diff --git a/django/db/models/query.py b/django/db/models/query.py index 98caaf004c..e92f6c4275 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -3,7 +3,7 @@ import warnings from django.conf import settings from django.db import connection, transaction, IntegrityError from django.db.models.fields import DateField, FieldDoesNotExist -from django.db.models.query_utils import Q +from django.db.models.query_utils import Q, select_related_descend from django.db.models import signals, sql from django.dispatch import dispatcher from django.utils.datastructures import SortedDict @@ -761,8 +761,7 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0, index_end = index_start + len(klass._meta.fields) obj = klass(*row[index_start:index_end]) for f in klass._meta.fields: - if (not f.rel or (not restricted and f.null) or - (restricted and f.name not in requested) or f.rel.parent_link): + if not select_related_descend(f, restricted, requested): continue if restricted: next = requested[f.name] diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py index 0ce7900c74..8dbb1ec667 100644 --- a/django/db/models/query_utils.py +++ b/django/db/models/query_utils.py @@ -48,3 +48,20 @@ class Q(tree.Node): obj.negate() return obj +def select_related_descend(field, restricted, requested): + """ + Returns True if this field should be used to descend deeper for + select_related() purposes. Used by both the query construction code + (sql.query.fill_related_selections()) and the model instance creation code + (query.get_cached_row()). + """ + if not field.rel: + return False + if field.rel.parent_link: + return False + if restricted and field.name not in requested: + return False + if not restricted and field.null: + return False + return True + diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index e8d10bc55b..6c06609969 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -7,6 +7,7 @@ databases). The abstraction barrier only works one way: this module has to know all about the internals of models in order to get the information it needs. """ +import datetime from copy import deepcopy from django.utils.tree import Node @@ -14,9 +15,10 @@ from django.utils.datastructures import SortedDict from django.dispatch import dispatcher from django.db import connection from django.db.models import signals +from django.db.models.fields import FieldDoesNotExist +from django.db.models.query_utils import select_related_descend from django.db.models.sql.where import WhereNode, EverythingNode, AND, OR from django.db.models.sql.datastructures import Count -from django.db.models.fields import FieldDoesNotExist from django.core.exceptions import FieldError from datastructures import EmptyResultSet, Empty, MultiJoin from constants import * @@ -56,6 +58,7 @@ class Query(object): self.start_meta = None self.select_fields = [] self.related_select_fields = [] + self.dupe_avoidance = {} # SQL-related attributes self.select = [] @@ -164,6 +167,7 @@ class Query(object): obj.start_meta = self.start_meta obj.select_fields = self.select_fields[:] obj.related_select_fields = self.related_select_fields[:] + obj.dupe_avoidance = self.dupe_avoidance.copy() obj.select = self.select[:] obj.tables = self.tables[:] obj.where = deepcopy(self.where) @@ -214,7 +218,7 @@ class Query(object): obj.select_related = False obj.related_select_cols = [] obj.related_select_fields = [] - if obj.distinct and len(obj.select) > 1: + if len(obj.select) > 1: obj = self.clone(CountQuery, _query=obj, where=self.where_class(), distinct=False) obj.select = [] @@ -362,10 +366,21 @@ class Query(object): item.relabel_aliases(change_map) self.select.append(item) self.select_fields = rhs.select_fields[:] - self.extra_select = rhs.extra_select.copy() - self.extra_tables = rhs.extra_tables - self.extra_where = rhs.extra_where - self.extra_params = rhs.extra_params + + if connector == OR: + # It would be nice to be able to handle this, but the queries don't + # really make sense (or return consistent value sets). Not worth + # the extra complexity when you can write a real query instead. + if self.extra_select and rhs.extra_select: + raise ValueError("When merging querysets using 'or', you " + "cannot have extra(select=...) on both sides.") + if self.extra_where and rhs.extra_where: + raise ValueError("When merging querysets using 'or', you " + "cannot have extra(where=...) on both sides.") + self.extra_select.update(rhs.extra_select) + self.extra_tables += rhs.extra_tables + self.extra_where += rhs.extra_where + self.extra_params += rhs.extra_params # Ordering uses the 'rhs' ordering, unless it has none, in which case # the current ordering is used. @@ -439,28 +454,39 @@ class Query(object): self._select_aliases = aliases return result - def get_default_columns(self, with_aliases=False, col_aliases=None): + def get_default_columns(self, with_aliases=False, col_aliases=None, + start_alias=None, opts=None, as_pairs=False): """ Computes the default columns for selecting every field in the base model. Returns a list of strings, quoted appropriately for use in SQL - directly, as well as a set of aliases used in the select statement. + directly, as well as a set of aliases used in the select statement (if + 'as_pairs' is True, returns a list of (alias, col_name) pairs instead + of strings as the first component and None as the second component). """ result = [] - table_alias = self.tables[0] - root_pk = self.model._meta.pk.column + if opts is None: + opts = self.model._meta + if start_alias: + table_alias = start_alias + else: + table_alias = self.tables[0] + root_pk = opts.pk.column seen = {None: table_alias} qn = self.quote_name_unless_alias qn2 = self.connection.ops.quote_name aliases = set() - for field, model in self.model._meta.get_fields_with_model(): + for field, model in opts.get_fields_with_model(): try: alias = seen[model] except KeyError: alias = self.join((table_alias, model._meta.db_table, root_pk, model._meta.pk.column)) seen[model] = alias + if as_pairs: + result.append((alias, field.column)) + continue if with_aliases and field.column in col_aliases: c_alias = 'Col%d' % len(col_aliases) result.append('%s.%s AS %s' % (qn(alias), @@ -473,6 +499,8 @@ class Query(object): aliases.add(r) if with_aliases: col_aliases.add(field.column) + if as_pairs: + return result, None return result, aliases def get_from_clause(self): @@ -609,6 +637,11 @@ class Query(object): alias, False) alias = joins[-1] col = target.column + if not field.rel: + # To avoid inadvertent trimming of a necessary alias, use the + # refcount to show that we are referencing a non-relation field on + # the model. + self.ref_alias(alias) # Must use left outer joins for nullable fields. for join in joins: @@ -829,8 +862,8 @@ class Query(object): if reuse and always_create and table in self.table_map: # Convert the 'reuse' to case to be "exclude everything but the - # reusable set for this table". - exclusions = set(self.table_map[table]).difference(reuse) + # reusable set, minus exclusions, for this table". + exclusions = set(self.table_map[table]).difference(reuse).union(set(exclusions)) always_create = False t_ident = (lhs_table, table, lhs_col, col) if not always_create: @@ -865,7 +898,8 @@ class Query(object): return alias def fill_related_selections(self, opts=None, root_alias=None, cur_depth=1, - used=None, requested=None, restricted=None, nullable=None): + used=None, requested=None, restricted=None, nullable=None, + dupe_set=None): """ Fill in the information needed for a select_related query. The current depth is measured as the number of connections away from the root model @@ -875,6 +909,7 @@ class Query(object): if not restricted and self.max_depth and cur_depth > self.max_depth: # We've recursed far enough; bail out. return + if not opts: opts = self.get_meta() root_alias = self.get_initial_alias() @@ -882,6 +917,10 @@ class Query(object): self.related_select_fields = [] if not used: used = set() + if dupe_set is None: + dupe_set = set() + orig_dupe_set = dupe_set + orig_used = used # Setup for the case when only particular related fields should be # included in the related selection. @@ -893,9 +932,10 @@ class Query(object): restricted = False for f, model in opts.get_fields_with_model(): - if (not f.rel or (restricted and f.name not in requested) or - (not restricted and f.null) or f.rel.parent_link): + if not select_related_descend(f, restricted, requested): continue + dupe_set = orig_dupe_set.copy() + used = orig_used.copy() table = f.rel.to._meta.db_table if nullable or f.null: promote = True @@ -906,18 +946,32 @@ class Query(object): alias = root_alias for int_model in opts.get_base_chain(model): lhs_col = int_opts.parents[int_model].column + dedupe = lhs_col in opts.duplicate_targets + if dedupe: + used.update(self.dupe_avoidance.get(id(opts), lhs_col), + ()) + dupe_set.add((opts, lhs_col)) int_opts = int_model._meta alias = self.join((alias, int_opts.db_table, lhs_col, int_opts.pk.column), exclusions=used, promote=promote) + for (dupe_opts, dupe_col) in dupe_set: + self.update_dupe_avoidance(dupe_opts, dupe_col, alias) else: alias = root_alias + + dedupe = f.column in opts.duplicate_targets + if dupe_set or dedupe: + used.update(self.dupe_avoidance.get((id(opts), f.column), ())) + if dedupe: + dupe_set.add((opts, f.column)) + alias = self.join((alias, table, f.column, f.rel.get_related_field().column), exclusions=used, promote=promote) used.add(alias) - self.related_select_cols.extend([(alias, f2.column) - for f2 in f.rel.to._meta.fields]) + self.related_select_cols.extend(self.get_default_columns( + start_alias=alias, opts=f.rel.to._meta, as_pairs=True)[0]) self.related_select_fields.extend(f.rel.to._meta.fields) if restricted: next = requested.get(f.name, {}) @@ -927,8 +981,10 @@ class Query(object): new_nullable = f.null else: new_nullable = None + for dupe_opts, dupe_col in dupe_set: + self.update_dupe_avoidance(dupe_opts, dupe_col, alias) self.fill_related_selections(f.rel.to._meta, alias, cur_depth + 1, - used, next, restricted, new_nullable) + used, next, restricted, new_nullable, dupe_set) def add_filter(self, filter_expr, connector=AND, negate=False, trim=False, can_reuse=None): @@ -1048,7 +1104,19 @@ class Query(object): # that's harmless. self.promote_alias(table) - self.where.add((alias, col, field, lookup_type, value), connector) + # To save memory and copying time, convert the value from the Python + # object to the actual value used in the SQL query. + if field: + params = field.get_db_prep_lookup(lookup_type, value) + else: + params = Field().get_db_prep_lookup(lookup_type, value) + if isinstance(value, datetime.datetime): + annotation = datetime.datetime + else: + annotation = bool(value) + + self.where.add((alias, col, field.db_type(), lookup_type, annotation, + params), connector) if negate: for alias in join_list: @@ -1058,7 +1126,8 @@ class Query(object): for alias in join_list: if self.alias_map[alias][JOIN_TYPE] == self.LOUTER: j_col = self.alias_map[alias][RHS_JOIN_COL] - entry = Node([(alias, j_col, None, 'isnull', True)]) + entry = Node([(alias, j_col, None, 'isnull', True, + [True])]) entry.negate() self.where.add(entry, AND) break @@ -1066,7 +1135,7 @@ class Query(object): # Leaky abstraction artifact: We have to specifically # exclude the "foo__in=[]" case from this handling, because # it's short-circuited in the Where class. - entry = Node([(alias, col, field, 'isnull', True)]) + entry = Node([(alias, col, None, 'isnull', True, [True])]) entry.negate() self.where.add(entry, AND) @@ -1114,7 +1183,9 @@ class Query(object): (which gives the table we are joining to), 'alias' is the alias for the table we are joining to. If dupe_multis is True, any many-to-many or many-to-one joins will always create a new alias (necessary for - disjunctive filters). + disjunctive filters). If can_reuse is not None, it's a list of aliases + that can be reused in these joins (nothing else can be reused in this + case). Returns the final field involved in the join, the target database column (used for any 'where' constraint), the final 'opts' value and the @@ -1122,7 +1193,14 @@ class Query(object): """ joins = [alias] last = [0] + dupe_set = set() + exclusions = set() for pos, name in enumerate(names): + try: + exclusions.add(int_alias) + except NameError: + pass + exclusions.add(alias) last.append(len(joins)) if name == 'pk': name = opts.pk.name @@ -1141,6 +1219,7 @@ class Query(object): names = opts.get_all_field_names() raise FieldError("Cannot resolve keyword %r into field. " "Choices are: %s" % (name, ", ".join(names))) + if not allow_many and (m2m or not direct): for alias in joins: self.unref_alias(alias) @@ -1150,12 +1229,27 @@ class Query(object): alias_list = [] for int_model in opts.get_base_chain(model): lhs_col = opts.parents[int_model].column + dedupe = lhs_col in opts.duplicate_targets + if dedupe: + exclusions.update(self.dupe_avoidance.get( + (id(opts), lhs_col), ())) + dupe_set.add((opts, lhs_col)) opts = int_model._meta alias = self.join((alias, opts.db_table, lhs_col, - opts.pk.column), exclusions=joins) + opts.pk.column), exclusions=exclusions) joins.append(alias) + exclusions.add(alias) + for (dupe_opts, dupe_col) in dupe_set: + self.update_dupe_avoidance(dupe_opts, dupe_col, alias) cached_data = opts._join_cache.get(name) orig_opts = opts + dupe_col = direct and field.column or field.field.column + dedupe = dupe_col in opts.duplicate_targets + if dupe_set or dedupe: + if dedupe: + dupe_set.add((opts, dupe_col)) + exclusions.update(self.dupe_avoidance.get((id(opts), dupe_col), + ())) if direct: if m2m: @@ -1177,9 +1271,11 @@ class Query(object): target) int_alias = self.join((alias, table1, from_col1, to_col1), - dupe_multis, joins, nullable=True, reuse=can_reuse) + dupe_multis, exclusions, nullable=True, + reuse=can_reuse) alias = self.join((int_alias, table2, from_col2, to_col2), - dupe_multis, joins, nullable=True, reuse=can_reuse) + dupe_multis, exclusions, nullable=True, + reuse=can_reuse) joins.extend([int_alias, alias]) elif field.rel: # One-to-one or many-to-one field @@ -1195,7 +1291,7 @@ class Query(object): opts, target) alias = self.join((alias, table, from_col, to_col), - exclusions=joins, nullable=field.null) + exclusions=exclusions, nullable=field.null) joins.append(alias) else: # Non-relation fields. @@ -1223,9 +1319,11 @@ class Query(object): target) int_alias = self.join((alias, table1, from_col1, to_col1), - dupe_multis, joins, nullable=True, reuse=can_reuse) + dupe_multis, exclusions, nullable=True, + reuse=can_reuse) alias = self.join((int_alias, table2, from_col2, to_col2), - dupe_multis, joins, nullable=True, reuse=can_reuse) + dupe_multis, exclusions, nullable=True, + reuse=can_reuse) joins.extend([int_alias, alias]) else: # One-to-many field (ForeignKey defined on the target model) @@ -1243,14 +1341,34 @@ class Query(object): opts, target) alias = self.join((alias, table, from_col, to_col), - dupe_multis, joins, nullable=True, reuse=can_reuse) + dupe_multis, exclusions, nullable=True, + reuse=can_reuse) joins.append(alias) + for (dupe_opts, dupe_col) in dupe_set: + try: + self.update_dupe_avoidance(dupe_opts, dupe_col, int_alias) + except NameError: + self.update_dupe_avoidance(dupe_opts, dupe_col, alias) + if pos != len(names) - 1: raise FieldError("Join on field %r not permitted." % name) return field, target, opts, joins, last + def update_dupe_avoidance(self, opts, col, alias): + """ + For a column that is one of multiple pointing to the same table, update + the internal data structures to note that this alias shouldn't be used + for those other columns. + """ + ident = id(opts) + for name in opts.duplicate_targets[col]: + try: + self.dupe_avoidance[ident, name].add(alias) + except KeyError: + self.dupe_avoidance[ident, name] = set([alias]) + def split_exclude(self, filter_expr, prefix): """ When doing an exclude against any kind of N-to-many relation, we need diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py index 0bb741d706..d8c5b074ec 100644 --- a/django/db/models/sql/subqueries.py +++ b/django/db/models/sql/subqueries.py @@ -49,7 +49,7 @@ class DeleteQuery(Query): for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): where = self.where_class() where.add((None, related.field.m2m_reverse_name(), - related.field, 'in', + related.field.db_type(), 'in', True, pk_list[offset : offset+GET_ITERATOR_CHUNK_SIZE]), AND) self.do_query(related.field.m2m_db_table(), where) @@ -59,11 +59,11 @@ class DeleteQuery(Query): if isinstance(f, generic.GenericRelation): from django.contrib.contenttypes.models import ContentType field = f.rel.to._meta.get_field(f.content_type_field_name) - w1.add((None, field.column, field, 'exact', - ContentType.objects.get_for_model(cls).id), AND) + w1.add((None, field.column, field.db_type(), 'exact', True, + [ContentType.objects.get_for_model(cls).id]), AND) for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): where = self.where_class() - where.add((None, f.m2m_column_name(), f, 'in', + where.add((None, f.m2m_column_name(), f.db_type(), 'in', True, pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND) if w1: @@ -81,7 +81,7 @@ class DeleteQuery(Query): for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): where = self.where_class() field = self.model._meta.pk - where.add((None, field.column, field, 'in', + where.add((None, field.column, field.db_type(), 'in', True, pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND) self.do_query(self.model._meta.db_table, where) @@ -204,7 +204,7 @@ class UpdateQuery(Query): for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE): self.where = self.where_class() f = self.model._meta.pk - self.where.add((None, f.column, f, 'in', + self.where.add((None, f.column, f.db_type(), 'in', True, pk_list[offset : offset + GET_ITERATOR_CHUNK_SIZE]), AND) self.values = [(related_field.column, None, '%s')] diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py index 14e54487a3..bf45bceb4b 100644 --- a/django/db/models/sql/where.py +++ b/django/db/models/sql/where.py @@ -21,8 +21,9 @@ class WhereNode(tree.Node): the correct SQL). The children in this tree are usually either Q-like objects or lists of - [table_alias, field_name, field_class, lookup_type, value]. However, a - child could also be any class with as_sql() and relabel_aliases() methods. + [table_alias, field_name, db_type, lookup_type, value_annotation, + params]. However, a child could also be any class with as_sql() and + relabel_aliases() methods. """ default = AND @@ -88,29 +89,24 @@ class WhereNode(tree.Node): def make_atom(self, child, qn): """ - Turn a tuple (table_alias, field_name, field_class, lookup_type, value) - into valid SQL. + Turn a tuple (table_alias, field_name, db_type, lookup_type, + value_annot, params) into valid SQL. Returns the string for the SQL fragment and the parameters to use for it. """ - table_alias, name, field, lookup_type, value = child + table_alias, name, db_type, lookup_type, value_annot, params = child if table_alias: lhs = '%s.%s' % (qn(table_alias), qn(name)) else: lhs = qn(name) - db_type = field and field.db_type() or None field_sql = connection.ops.field_cast_sql(db_type) % lhs - if isinstance(value, datetime.datetime): + if value_annot is datetime.datetime: cast_sql = connection.ops.datetime_cast_sql() else: cast_sql = '%s' - if field: - params = field.get_db_prep_lookup(lookup_type, value) - else: - params = Field().get_db_prep_lookup(lookup_type, value) if isinstance(params, QueryWrapper): extra, params = params.data else: @@ -123,11 +119,11 @@ class WhereNode(tree.Node): connection.operators[lookup_type] % cast_sql), params) if lookup_type == 'in': - if not value: + if not value_annot: raise EmptyResultSet if extra: return ('%s IN %s' % (field_sql, extra), params) - return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(value))), + return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(params))), params) elif lookup_type in ('range', 'year'): return ('%s BETWEEN %%s and %%s' % field_sql, params) @@ -135,8 +131,8 @@ class WhereNode(tree.Node): return ('%s = %%s' % connection.ops.date_extract_sql(lookup_type, field_sql), params) elif lookup_type == 'isnull': - return ('%s IS %sNULL' % (field_sql, (not value and 'NOT ' or '')), - params) + return ('%s IS %sNULL' % (field_sql, + (not value_annot and 'NOT ' or '')), ()) elif lookup_type == 'search': return (connection.ops.fulltext_search_sql(field_sql), params) elif lookup_type in ('regex', 'iregex'): diff --git a/django/db/transaction.py b/django/db/transaction.py index c0c3779f6a..cd27cf6044 100644 --- a/django/db/transaction.py +++ b/django/db/transaction.py @@ -196,7 +196,10 @@ def commit_on_success(func): managed(True) try: res = func(*args, **kw) - except Exception, e: + except (Exception, KeyboardInterrupt, SystemExit): + # (We handle KeyboardInterrupt and SystemExit specially, since + # they don't inherit from Exception in Python 2.5, but we + # should treat them uniformly here.) if is_dirty(): rollback() raise diff --git a/django/middleware/http.py b/django/middleware/http.py index 2ef46c6b61..53b65c1034 100644 --- a/django/middleware/http.py +++ b/django/middleware/http.py @@ -19,14 +19,14 @@ class ConditionalGetMiddleware(object): # Setting the status is enough here. The response handling path # automatically removes content for this status code (in # http.conditional_content_removal()). - response.status = 304 + response.status_code = 304 if response.has_header('Last-Modified'): if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None) if if_modified_since == response['Last-Modified']: # Setting the status code is enough here (same reasons as # above). - response.status = 304 + response.status_code = 304 return response diff --git a/django/newforms/fields.py b/django/newforms/fields.py index dfe46a2e3e..6734c5450e 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -535,13 +535,17 @@ class BooleanField(Field): def clean(self, value): """Returns a Python boolean object.""" - super(BooleanField, self).clean(value) # Explicitly check for the string 'False', which is what a hidden field # will submit for False. Because bool("True") == True, we don't need to # handle that explicitly. if value == 'False': - return False - return bool(value) + value = False + else: + value = bool(value) + super(BooleanField, self).clean(value) + if not value and self.required: + raise ValidationError(self.error_messages['required']) + return value class NullBooleanField(BooleanField): """ diff --git a/django/test/testcases.py b/django/test/testcases.py index ee83b960a6..3bad3995bb 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -4,10 +4,12 @@ from urlparse import urlsplit, urlunsplit from django.http import QueryDict from django.db import transaction +from django.conf import settings from django.core import mail from django.core.management import call_command from django.test import _doctest as doctest from django.test.client import Client +from django.core.urlresolvers import clear_url_caches normalize_long_ints = lambda s: re.sub(r'(? AuthType Basic AuthName "example.com" + **AuthUserFile /dev/null** **AuthBasicAuthoritative Off** Require valid-user diff --git a/docs/db-api.txt b/docs/db-api.txt index f80d63797a..9a604bf320 100644 --- a/docs/db-api.txt +++ b/docs/db-api.txt @@ -443,6 +443,31 @@ This is roughly equivalent to:: Note, however, that the first of these will raise ``IndexError`` while the second will raise ``DoesNotExist`` if no objects match the given criteria. +Combining QuerySets +------------------- + +If you have two ``QuerySet`` instances that act on the same model, you can +combine them using ``&`` and ``|`` to get the items that are in both result +sets or in either results set, respectively. For example:: + + Entry.objects.filter(pubdate__gte=date1) & \ + Entry.objects.filter(headline__startswith="What") + +will combine the two queries into a single SQL query. Of course, in this case +you could have achieved the same result using multiple filters on the same +``QuerySet``, but sometimes the ability to combine individual ``QuerySet`` +instance is useful. + +Be careful, if you are using ``extra()`` to add custom handling to your +``QuerySet`` however. All the ``extra()`` components are merged and the result +may or may not make sense. If you are using custom SQL fragments in your +``extra()`` calls, Django will not inspect these fragments to see if they need +to be rewritten because of changes in the merged query. So test the effects +carefully. Also realise that if you are combining two ``QuerySets`` with +``|``, you cannot use ``extra(select=...)`` or ``extra(where=...)`` on *both* +``QuerySets``. You can only use those calls on one or the other (Django will +raise a ``ValueError`` if you try to use this incorrectly). + QuerySet methods that return new QuerySets ------------------------------------------ diff --git a/docs/flatpages.txt b/docs/flatpages.txt index a538217642..f1a354c653 100644 --- a/docs/flatpages.txt +++ b/docs/flatpages.txt @@ -14,9 +14,14 @@ custom Django application. A flatpage can use a custom template or a default, systemwide flatpage template. It can be associated with one, or multiple, sites. +**New in Django development version** + +The content field may optionally be left blank if you prefer to put your +content in a custom template. + Here are some examples of flatpages on Django-powered sites: - * http://www.chicagocrime.org/about/ + * http://www.everyblock.com/about/ * http://www.lawrence.com/about/contact/ Installation diff --git a/docs/model-api.txt b/docs/model-api.txt index 02a9fd2d95..4accad122a 100644 --- a/docs/model-api.txt +++ b/docs/model-api.txt @@ -1677,7 +1677,7 @@ still only creating one database table per child model at the database level. When an abstract base class is created, Django makes any ``Meta`` inner class you declared on the base class available as an attribute. If a child class -does not declared its own ``Meta`` class, it will inherit the parent's +does not declare its own ``Meta`` class, it will inherit the parent's ``Meta``. If the child wants to extend the parent's ``Meta`` class, it can subclass it. For example:: diff --git a/docs/testing.txt b/docs/testing.txt index befa6979af..0b18545efb 100644 --- a/docs/testing.txt +++ b/docs/testing.txt @@ -797,6 +797,37 @@ another test, or by the order of test execution. .. _dumpdata documentation: ../django-admin/#dumpdata-appname-appname .. _loaddata documentation: ../django-admin/#loaddata-fixture-fixture +URLconf configuration +~~~~~~~~~~~~~~~~~~~~~ + +**New in Django development version** + +If your application provides views, you may want to include tests that +use the test client to exercise those views. However, an end user is free +to deploy the views in your application at any URL of their choosing. +This means that your tests can't rely upon the fact that your views will +be available at a particular URL. + +In order to provide a reliable URL space for your test, +``django.test.TestCase`` provides the ability to customize the URLconf +configuration for the duration of the execution of a test suite. +If your ``TestCase`` instance defines an ``urls`` attribute, the +``TestCase`` will use the value of that attribute as the ``ROOT_URLCONF`` +for the duration of that test. + +For example:: + + from django.test import TestCase + + class TestMyViews(TestCase): + urls = 'myapp.test_urls' + + def testIndexPageView(self): + # Here you'd test your view using ``Client``. + +This test case will use the contents of ``myapp.test_urls`` as the +URLconf for the duration of the test case. + Emptying the test outbox ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/regressiontests/extra_regress/__init__.py b/tests/regressiontests/extra_regress/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/extra_regress/models.py b/tests/regressiontests/extra_regress/models.py new file mode 100644 index 0000000000..3bcc3075ec --- /dev/null +++ b/tests/regressiontests/extra_regress/models.py @@ -0,0 +1,55 @@ +import copy + +from django.db import models +from django.db.models.query import Q + + +class RevisionableModel(models.Model): + base = models.ForeignKey('self', null=True) + title = models.CharField(blank=True, max_length=255) + + def __unicode__(self): + return u"%s (%s, %s)" % (self.title, self.id, self.base.id) + + def save(self): + super(RevisionableModel, self).save() + if not self.base: + self.base = self + super(RevisionableModel, self).save() + + def new_revision(self): + new_revision = copy.copy(self) + new_revision.pk = None + return new_revision + +__test__ = {"API_TESTS": """ +### Regression tests for #7314 and #7372 + +>>> rm = RevisionableModel.objects.create(title='First Revision') +>>> rm.pk, rm.base.pk +(1, 1) + +>>> rm2 = rm.new_revision() +>>> rm2.title = "Second Revision" +>>> rm2.save() +>>> print u"%s of %s" % (rm2.title, rm2.base.title) +Second Revision of First Revision + +>>> rm2.pk, rm2.base.pk +(2, 1) + +Queryset to match most recent revision: +>>> qs = RevisionableModel.objects.extra(where=["%(table)s.id IN (SELECT MAX(rev.id) FROM %(table)s AS rev GROUP BY rev.base_id)" % {'table': RevisionableModel._meta.db_table,}],) +>>> qs +[] + +Queryset to search for string in title: +>>> qs2 = RevisionableModel.objects.filter(title__contains="Revision") +>>> qs2 +[, ] + +Following queryset should return the most recent revision: +>>> qs & qs2 +[] + +"""} diff --git a/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json b/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json new file mode 100644 index 0000000000..e655fbbf3f --- /dev/null +++ b/tests/regressiontests/fixtures_regress/fixtures/big-fixture.json @@ -0,0 +1,83 @@ +[ + { + "pk": 6, + "model": "fixtures_regress.channel", + "fields": { + "name": "Business" + } + }, + + { + "pk": 1, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 1", + "channels": [6] + } + }, + { + "pk": 2, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 2", + "channels": [6] + } + }, + { + "pk": 3, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 3", + "channels": [6] + } + }, + { + "pk": 4, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 4", + "channels": [6] + } + }, + + { + "pk": 5, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 5", + "channels": [6] + } + }, + { + "pk": 6, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 6", + "channels": [6] + } + }, + { + "pk": 7, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 7", + "channels": [6] + } + }, + { + "pk": 8, + "model": "fixtures_regress.article", + "fields": { + "title": "Article Title 8", + "channels": [6] + } + }, + { + "pk": 9, + "model": "fixtures_regress.article", + "fields": { + "title": "Yet Another Article", + "channels": [6] + } + } +] \ No newline at end of file diff --git a/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json b/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json new file mode 100644 index 0000000000..00c482b3dd --- /dev/null +++ b/tests/regressiontests/fixtures_regress/fixtures/model-inheritance.json @@ -0,0 +1,4 @@ +[ + {"pk": 1, "model": "fixtures_regress.parent", "fields": {"name": "fred"}}, + {"pk": 1, "model": "fixtures_regress.child", "fields": {"data": "apple"}} +] diff --git a/tests/regressiontests/fixtures_regress/models.py b/tests/regressiontests/fixtures_regress/models.py index 59fc167d50..2c048dc0b8 100644 --- a/tests/regressiontests/fixtures_regress/models.py +++ b/tests/regressiontests/fixtures_regress/models.py @@ -20,7 +20,7 @@ class Plant(models.Model): class Stuff(models.Model): name = models.CharField(max_length=20, null=True) owner = models.ForeignKey(User, null=True) - + def __unicode__(self): # Oracle doesn't distinguish between None and the empty string. # This hack makes the test case pass using Oracle. @@ -38,13 +38,29 @@ class Absolute(models.Model): super(Absolute, self).__init__(*args, **kwargs) Absolute.load_count += 1 +class Parent(models.Model): + name = models.CharField(max_length=10) + +class Child(Parent): + data = models.CharField(max_length=10) + +# Models to regresison check #7572 +class Channel(models.Model): + name = models.CharField(max_length=255) + +class Article(models.Model): + title = models.CharField(max_length=255) + channels = models.ManyToManyField(Channel) + + class Meta: + ordering = ('id',) __test__ = {'API_TESTS':""" >>> from django.core import management # Load a fixture that uses PK=1 >>> management.call_command('loaddata', 'sequence', verbosity=0) - + # Create a new animal. Without a sequence reset, this new object # will take a PK of 1 (on Postgres), and the save will fail. # This is a regression test for ticket #3790. @@ -61,9 +77,9 @@ __test__ = {'API_TESTS':""" [] ############################################### -# Regression test for ticket #6436 -- +# Regression test for ticket #6436 -- # os.path.join will throw away the initial parts of a path if it encounters -# an absolute path. This means that if a fixture is specified as an absolute path, +# an absolute path. This means that if a fixture is specified as an absolute path, # we need to make sure we don't discover the absolute path in every fixture directory. >>> load_absolute_path = os.path.join(os.path.dirname(__file__), 'fixtures', 'absolute.json') @@ -94,4 +110,28 @@ No fixture data found for 'bad_fixture2'. (File format may be invalid.) >>> sys.stderr = savestderr +############################################### +# Test for ticket #7565 -- PostgreSQL sequence resetting checks shouldn't +# ascend to parent models when inheritance is used (since they are treated +# individually). + +>>> management.call_command('loaddata', 'model-inheritance.json', verbosity=0) + +############################################### +# Test for ticket #7572 -- MySQL has a problem if the same connection is +# used to create tables, load data, and then query over that data. +# To compensate, we close the connection after running loaddata. +# This ensures that a new connection is opened when test queries are issued. + +>>> management.call_command('loaddata', 'big-fixture.json', verbosity=0) + +>>> articles = Article.objects.exclude(id=9) +>>> articles.values_list('id', flat=True) +[1, 2, 3, 4, 5, 6, 7, 8] + +# Just for good measure, run the same query again. Under the influence of +# ticket #7572, this will give a different result to the previous call. +>>> articles.values_list('id', flat=True) +[1, 2, 3, 4, 5, 6, 7, 8] + """} diff --git a/tests/regressiontests/forms/error_messages.py b/tests/regressiontests/forms/error_messages.py index 9f972f5b90..381282f121 100644 --- a/tests/regressiontests/forms/error_messages.py +++ b/tests/regressiontests/forms/error_messages.py @@ -237,7 +237,7 @@ ValidationError: [u'REQUIRED'] Traceback (most recent call last): ... ValidationError: [u'INVALID'] ->>> f.clean('http://www.jfoiwjfoi23jfoijoaijfoiwjofiwjefewl.com') +>>> f.clean('http://www.broken.djangoproject.com') Traceback (most recent call last): ... ValidationError: [u'INVALID LINK'] diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py index f3b6a96a1e..c9f3efdbda 100644 --- a/tests/regressiontests/forms/fields.py +++ b/tests/regressiontests/forms/fields.py @@ -887,7 +887,7 @@ u'http://www.google.com' Traceback (most recent call last): ... ValidationError: [u'Enter a valid URL.'] ->>> f.clean('http://www.jfoiwjfoi23jfoijoaijfoiwjofiwjefewl.com') # bad domain +>>> f.clean('http://www.broken.djangoproject.com') # bad domain Traceback (most recent call last): ... ValidationError: [u'This URL appears to be a broken link.'] @@ -937,18 +937,24 @@ ValidationError: [u'This field is required.'] >>> f.clean(True) True >>> f.clean(False) -False +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] >>> f.clean(1) True >>> f.clean(0) -False +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] >>> f.clean('Django rocks') True >>> f.clean('True') True >>> f.clean('False') -False +Traceback (most recent call last): +... +ValidationError: [u'This field is required.'] >>> f = BooleanField(required=False) >>> f.clean('') diff --git a/tests/regressiontests/many_to_one_regress/models.py b/tests/regressiontests/many_to_one_regress/models.py index 4e49df1555..429bdd7558 100644 --- a/tests/regressiontests/many_to_one_regress/models.py +++ b/tests/regressiontests/many_to_one_regress/models.py @@ -28,6 +28,24 @@ class Child(models.Model): parent = models.ForeignKey(Parent) +# Multiple paths to the same model (#7110, #7125) +class Category(models.Model): + name = models.CharField(max_length=20) + + def __unicode__(self): + return self.name + +class Record(models.Model): + category = models.ForeignKey(Category) + +class Relation(models.Model): + left = models.ForeignKey(Record, related_name='left_set') + right = models.ForeignKey(Record, related_name='right_set') + + def __unicode__(self): + return u"%s - %s" % (self.left.category.name, self.right.category.name) + + __test__ = {'API_TESTS':""" >>> Third.objects.create(id='3', name='An example') @@ -73,4 +91,26 @@ Traceback (most recent call last): ... ValueError: Cannot assign "": "Child.parent" must be a "Parent" instance. +# Test of multiple ForeignKeys to the same model (bug #7125) + +>>> c1 = Category.objects.create(name='First') +>>> c2 = Category.objects.create(name='Second') +>>> c3 = Category.objects.create(name='Third') +>>> r1 = Record.objects.create(category=c1) +>>> r2 = Record.objects.create(category=c1) +>>> r3 = Record.objects.create(category=c2) +>>> r4 = Record.objects.create(category=c2) +>>> r5 = Record.objects.create(category=c3) +>>> r = Relation.objects.create(left=r1, right=r2) +>>> r = Relation.objects.create(left=r3, right=r4) +>>> r = Relation.objects.create(left=r1, right=r3) +>>> r = Relation.objects.create(left=r5, right=r2) +>>> r = Relation.objects.create(left=r3, right=r2) + +>>> Relation.objects.filter(left__category__name__in=['First'], right__category__name__in=['Second']) +[] + +>>> Category.objects.filter(record__left_set__right__category__name='Second').order_by('name') +[, ] + """} diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py index e279a0669f..c2ba9ee008 100644 --- a/tests/regressiontests/model_fields/tests.py +++ b/tests/regressiontests/model_fields/tests.py @@ -15,4 +15,21 @@ Decimal("3.14") Traceback (most recent call last): ... ValidationError: [u'This value must be a decimal number.'] + +>>> f = DecimalField(max_digits=5, decimal_places=1) +>>> x = f.to_python(2) +>>> y = f.to_python('2.6') + +>>> f.get_db_prep_save(x) +u'2.0' +>>> f.get_db_prep_save(y) +u'2.6' +>>> f.get_db_prep_save(None) +>>> f.get_db_prep_lookup('exact', x) +[u'2.0'] +>>> f.get_db_prep_lookup('exact', y) +[u'2.6'] +>>> f.get_db_prep_lookup('exact', None) +[None] + """ diff --git a/tests/regressiontests/model_inheritance_regress/models.py b/tests/regressiontests/model_inheritance_regress/models.py index 33e2e0e4f6..24d6186150 100644 --- a/tests/regressiontests/model_inheritance_regress/models.py +++ b/tests/regressiontests/model_inheritance_regress/models.py @@ -131,4 +131,26 @@ __test__ = {'API_TESTS':""" >>> Child.objects.dates('created', 'month') [datetime.datetime(2008, 6, 1, 0, 0)] +# Regression test for #7276: calling delete() on a model with multi-table +# inheritance should delete the associated rows from any ancestor tables, as +# well as any descendent objects. + +>>> ident = ItalianRestaurant.objects.all()[0].id +>>> Place.objects.get(pk=ident) + +>>> xx = Restaurant.objects.create(name='a', address='xx', serves_hot_dogs=True, serves_pizza=False) + +# This should delete both Restuarants, plus the related places, plus the ItalianRestaurant. +>>> Restaurant.objects.all().delete() + +>>> Place.objects.get(pk=ident) +Traceback (most recent call last): +... +DoesNotExist: Place matching query does not exist. + +>>> ItalianRestaurant.objects.get(pk=ident) +Traceback (most recent call last): +... +DoesNotExist: ItalianRestaurant matching query does not exist. + """} diff --git a/tests/regressiontests/model_inheritance_select_related/__init__.py b/tests/regressiontests/model_inheritance_select_related/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/model_inheritance_select_related/models.py b/tests/regressiontests/model_inheritance_select_related/models.py new file mode 100644 index 0000000000..a97ecaadea --- /dev/null +++ b/tests/regressiontests/model_inheritance_select_related/models.py @@ -0,0 +1,47 @@ +""" +Regression tests for the interaction between model inheritance and +select_related(). +""" + +from django.db import models + +class Place(models.Model): + name = models.CharField(max_length=50) + + class Meta: + ordering = ('name',) + + def __unicode__(self): + return u"%s the place" % self.name + +class Restaurant(Place): + serves_sushi = models.BooleanField() + serves_steak = models.BooleanField() + + def __unicode__(self): + return u"%s the restaurant" % self.name + +class Person(models.Model): + name = models.CharField(max_length=50) + favorite_restaurant = models.ForeignKey(Restaurant) + + def __unicode__(self): + return self.name + +__test__ = {'API_TESTS':""" +Regression test for #7246 + +>>> r1 = Restaurant.objects.create(name="Nobu", serves_sushi=True, serves_steak=False) +>>> r2 = Restaurant.objects.create(name="Craft", serves_sushi=False, serves_steak=True) +>>> p1 = Person.objects.create(name="John", favorite_restaurant=r1) +>>> p2 = Person.objects.create(name="Jane", favorite_restaurant=r2) + +>>> Person.objects.order_by('name').select_related() +[, ] + +>>> jane = Person.objects.order_by('name').select_related('favorite_restaurant')[0] +>>> jane.favorite_restaurant.name +u'Craft' + +"""} + diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index c02ad73998..566411e513 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -3,13 +3,15 @@ Various complex queries that have been problematic in the past. """ import datetime +import pickle from django.db import models from django.db.models.query import Q class Tag(models.Model): name = models.CharField(max_length=10) - parent = models.ForeignKey('self', blank=True, null=True) + parent = models.ForeignKey('self', blank=True, null=True, + related_name='children') def __unicode__(self): return self.name @@ -24,6 +26,14 @@ class Note(models.Model): def __unicode__(self): return self.note +class Annotation(models.Model): + name = models.CharField(max_length=10) + tag = models.ForeignKey(Tag) + notes = models.ManyToManyField(Note) + + def __unicode__(self): + return self.name + class ExtraInfo(models.Model): info = models.CharField(max_length=100) note = models.ForeignKey(Note) @@ -162,85 +172,67 @@ class Child(models.Model): person = models.OneToOneField(Member, primary_key=True) parent = models.ForeignKey(Member, related_name="children") +# Custom primary keys interfered with ordering in the past. +class CustomPk(models.Model): + name = models.CharField(max_length=10, primary_key=True) + extra = models.CharField(max_length=10) + + class Meta: + ordering = ['name', 'extra'] + +class Related(models.Model): + custom = models.ForeignKey(CustomPk) + __test__ = {'API_TESTS':""" ->>> t1 = Tag(name='t1') ->>> t1.save() ->>> t2 = Tag(name='t2', parent=t1) ->>> t2.save() ->>> t3 = Tag(name='t3', parent=t1) ->>> t3.save() ->>> t4 = Tag(name='t4', parent=t3) ->>> t4.save() ->>> t5 = Tag(name='t5', parent=t3) ->>> t5.save() +>>> t1 = Tag.objects.create(name='t1') +>>> t2 = Tag.objects.create(name='t2', parent=t1) +>>> t3 = Tag.objects.create(name='t3', parent=t1) +>>> t4 = Tag.objects.create(name='t4', parent=t3) +>>> t5 = Tag.objects.create(name='t5', parent=t3) ->>> n1 = Note(note='n1', misc='foo') ->>> n1.save() ->>> n2 = Note(note='n2', misc='bar') ->>> n2.save() ->>> n3 = Note(note='n3', misc='foo') ->>> n3.save() +>>> n1 = Note.objects.create(note='n1', misc='foo') +>>> n2 = Note.objects.create(note='n2', misc='bar') +>>> n3 = Note.objects.create(note='n3', misc='foo') Create these out of order so that sorting by 'id' will be different to sorting by 'info'. Helps detect some problems later. ->>> e2 = ExtraInfo(info='e2', note=n2) ->>> e2.save() ->>> e1 = ExtraInfo(info='e1', note=n1) ->>> e1.save() +>>> e2 = ExtraInfo.objects.create(info='e2', note=n2) +>>> e1 = ExtraInfo.objects.create(info='e1', note=n1) ->>> a1 = Author(name='a1', num=1001, extra=e1) ->>> a1.save() ->>> a2 = Author(name='a2', num=2002, extra=e1) ->>> a2.save() ->>> a3 = Author(name='a3', num=3003, extra=e2) ->>> a3.save() ->>> a4 = Author(name='a4', num=4004, extra=e2) ->>> a4.save() +>>> a1 = Author.objects.create(name='a1', num=1001, extra=e1) +>>> a2 = Author.objects.create(name='a2', num=2002, extra=e1) +>>> a3 = Author.objects.create(name='a3', num=3003, extra=e2) +>>> a4 = Author.objects.create(name='a4', num=4004, extra=e2) >>> time1 = datetime.datetime(2007, 12, 19, 22, 25, 0) >>> time2 = datetime.datetime(2007, 12, 19, 21, 0, 0) >>> time3 = datetime.datetime(2007, 12, 20, 22, 25, 0) >>> time4 = datetime.datetime(2007, 12, 20, 21, 0, 0) ->>> i1 = Item(name='one', created=time1, modified=time1, creator=a1, note=n3) ->>> i1.save() +>>> i1 = Item.objects.create(name='one', created=time1, modified=time1, creator=a1, note=n3) >>> i1.tags = [t1, t2] ->>> i2 = Item(name='two', created=time2, creator=a2, note=n2) ->>> i2.save() +>>> i2 = Item.objects.create(name='two', created=time2, creator=a2, note=n2) >>> i2.tags = [t1, t3] ->>> i3 = Item(name='three', created=time3, creator=a2, note=n3) ->>> i3.save() ->>> i4 = Item(name='four', created=time4, creator=a4, note=n3) ->>> i4.save() +>>> i3 = Item.objects.create(name='three', created=time3, creator=a2, note=n3) +>>> i4 = Item.objects.create(name='four', created=time4, creator=a4, note=n3) >>> i4.tags = [t4] ->>> r1 = Report(name='r1', creator=a1) ->>> r1.save() ->>> r2 = Report(name='r2', creator=a3) ->>> r2.save() ->>> r3 = Report(name='r3') ->>> r3.save() +>>> r1 = Report.objects.create(name='r1', creator=a1) +>>> r2 = Report.objects.create(name='r2', creator=a3) +>>> r3 = Report.objects.create(name='r3') Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the Meta.ordering will be rank3, rank2, rank1. ->>> rank1 = Ranking(rank=2, author=a2) ->>> rank1.save() ->>> rank2 = Ranking(rank=1, author=a3) ->>> rank2.save() ->>> rank3 = Ranking(rank=3, author=a1) ->>> rank3.save() +>>> rank1 = Ranking.objects.create(rank=2, author=a2) +>>> rank2 = Ranking.objects.create(rank=1, author=a3) +>>> rank3 = Ranking.objects.create(rank=3, author=a1) ->>> c1 = Cover(title="first", item=i4) ->>> c1.save() ->>> c2 = Cover(title="second", item=i2) ->>> c2.save() +>>> c1 = Cover.objects.create(title="first", item=i4) +>>> c2 = Cover.objects.create(title="second", item=i2) ->>> n1 = Number(num=4) ->>> n1.save() ->>> n2 = Number(num=8) ->>> n2.save() ->>> n3 = Number(num=12) ->>> n3.save() +>>> num1 = Number.objects.create(num=4) +>>> num2 = Number.objects.create(num=8) +>>> num3 = Number.objects.create(num=12) Bug #1050 >>> Item.objects.filter(tags__isnull=True) @@ -346,6 +338,10 @@ Bug #1878, #2939 4 >>> xx.delete() +Bug #7323 +>>> Item.objects.values('creator', 'name').count() +4 + Bug #2253 >>> q1 = Item.objects.order_by('name') >>> q2 = Item.objects.filter(id=i1.id) @@ -387,6 +383,10 @@ Bug #4510 >>> Author.objects.filter(report__name='r1') [] +Bug #7378 +>>> a1.report_set.all() +[] + Bug #5324, #6704 >>> Item.objects.filter(tags__name='t4') [] @@ -791,5 +791,19 @@ Empty querysets can be merged with others. >>> Note.objects.all() & Note.objects.none() [] +Bug #7204, #7506 -- make sure querysets with related fields can be pickled. If +this doesn't crash, it's a Good Thing. +>>> out = pickle.dumps(Item.objects.all()) + +Bug #7277 +>>> ann1 = Annotation.objects.create(name='a1', tag=t1) +>>> ann1.notes.add(n1) +>>> n1.annotation_set.filter(Q(tag=t5) | Q(tag__children=t5) | Q(tag__children__children=t5)) +[] + +Bug #7371 +>>> Related.objects.order_by('custom') +[] + """} diff --git a/tests/regressiontests/select_related_regress/__init__.py b/tests/regressiontests/select_related_regress/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/select_related_regress/models.py b/tests/regressiontests/select_related_regress/models.py new file mode 100644 index 0000000000..1688053e2d --- /dev/null +++ b/tests/regressiontests/select_related_regress/models.py @@ -0,0 +1,60 @@ +from django.db import models + +class Building(models.Model): + name = models.CharField(max_length=10) + + def __unicode__(self): + return u"Building: %s" % self.name + +class Device(models.Model): + building = models.ForeignKey('Building') + name = models.CharField(max_length=10) + + def __unicode__(self): + return u"device '%s' in building %s" % (self.name, self.building) + +class Port(models.Model): + device = models.ForeignKey('Device') + number = models.CharField(max_length=10) + + def __unicode__(self): + return u"%s/%s" % (self.device.name, self.number) + +class Connection(models.Model): + start = models.ForeignKey(Port, related_name='connection_start', + unique=True) + end = models.ForeignKey(Port, related_name='connection_end', unique=True) + + def __unicode__(self): + return u"%s to %s" % (self.start, self.end) + +__test__ = {'API_TESTS': """ +Regression test for bug #7110. When using select_related(), we must query the +Device and Building tables using two different aliases (each) in order to +differentiate the start and end Connection fields. The net result is that both +the "connections = ..." queries here should give the same results. + +>>> b=Building.objects.create(name='101') +>>> dev1=Device.objects.create(name="router", building=b) +>>> dev2=Device.objects.create(name="switch", building=b) +>>> dev3=Device.objects.create(name="server", building=b) +>>> port1=Port.objects.create(number='4',device=dev1) +>>> port2=Port.objects.create(number='7',device=dev2) +>>> port3=Port.objects.create(number='1',device=dev3) +>>> c1=Connection.objects.create(start=port1, end=port2) +>>> c2=Connection.objects.create(start=port2, end=port3) + +>>> connections=Connection.objects.filter(start__device__building=b, end__device__building=b).order_by('id') +>>> [(c.id, unicode(c.start), unicode(c.end)) for c in connections] +[(1, u'router/4', u'switch/7'), (2, u'switch/7', u'server/1')] + +>>> connections=Connection.objects.filter(start__device__building=b, end__device__building=b).select_related().order_by('id') +>>> [(c.id, unicode(c.start), unicode(c.end)) for c in connections] +[(1, u'router/4', u'switch/7'), (2, u'switch/7', u'server/1')] + +# This final query should only join seven tables (port, device and building +# twice each, plus connection once). +>>> connections.query.count_active_tables() +7 + +"""} diff --git a/tests/regressiontests/string_lookup/models.py b/tests/regressiontests/string_lookup/models.py index 1bdb2d4452..39e7955592 100644 --- a/tests/regressiontests/string_lookup/models.py +++ b/tests/regressiontests/string_lookup/models.py @@ -97,6 +97,12 @@ __test__ = {'API_TESTS': ur""" >>> Article.objects.get(text__exact='The quick brown fox jumps over the lazy dog.') +# Regression tests for #2170: test case sensitiveness +>>> Article.objects.filter(text__exact='tHe qUick bRown fOx jUmps over tHe lazy dog.') +[] +>>> Article.objects.filter(text__iexact='tHe qUick bRown fOx jUmps over tHe lazy dog.') +[] + >>> Article.objects.get(text__contains='quick brown fox') diff --git a/tests/regressiontests/test_client_regress/models.py b/tests/regressiontests/test_client_regress/models.py index a204ec3e72..37e81668b6 100644 --- a/tests/regressiontests/test_client_regress/models.py +++ b/tests/regressiontests/test_client_regress/models.py @@ -318,3 +318,22 @@ class ExceptionTests(TestCase): self.client.get("/test_client_regress/staff_only/") except SuspiciousOperation: self.fail("Staff should be able to visit this page") + +# We need two different tests to check URLconf subsitution - one to check +# it was changed, and another one (without self.urls) to check it was reverted on +# teardown. This pair of tests relies upon the alphabetical ordering of test execution. +class UrlconfSubstitutionTests(TestCase): + urls = 'regressiontests.test_client_regress.urls' + + def test_urlconf_was_changed(self): + "TestCase can enforce a custom URLConf on a per-test basis" + url = reverse('arg_view', args=['somename']) + self.assertEquals(url, '/arg_view/somename/') + +# This test needs to run *after* UrlconfSubstitutionTests; the zz prefix in the +# name is to ensure alphabetical ordering. +class zzUrlconfSubstitutionTests(TestCase): + def test_urlconf_was_reverted(self): + "URLconf is reverted to original value after modification in a TestCase" + url = reverse('arg_view', args=['somename']) + self.assertEquals(url, '/test_client_regress/arg_view/somename/')