
рдирдорд╕реНрддреЗ рджреВрд╕рд░реЗ рджрд┐рди рдореЙрдбрд▓, рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдореЛрдВ рд╕рд╣рд┐рдд django рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд░рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рдерд╛ред рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп django рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдерд╛ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЧреБрдЧреНрд▓рд┐рдВрдЧ рдиреЗ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рд╕рдордЧреНрд░ рдЪрд┐рддреНрд░ рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЬрдЧрд╣ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ
django-admin-tools рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрдВрддреНрд░рд┐рдХрд╛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ред рдФрд░ рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ django 1.3 рдкрд░ рдХрд┐рдП рдЧрдП рдереЗред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦреЗрдВ
LANGUAGE_CODE = 'ru-RU' USE_I18N = True
рдлрд┐рд░ рдбреИрд╢рдмреЛрд░реНрдб рдФрд░ django-admin-tools рдореЗрдиреВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░рдореЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ
python manage.py custommenu
python manage.py customdashboard
рдЗрди рдЖрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдбреИрд╢рдмреЛрд░реНрдб рдУрд░ рдореЗрдиреНрдпреВрд╣реЛрдо рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред рдЕрдЧрд▓рд╛, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ
ADMIN_TOOLS_MENU = 'myproject.menu.CustomMenu' ADMIN_TOOLS_INDEX_DASHBOARD = 'myproject.dashboard.CustomIndexDashboard' ADMIN_TOOLS_APP_INDEX_DASHBOARD = 'myproject.dashboard.CustomAppIndexDashboard'
рд░рд╛рд╕реНрддрд╛ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдХрдХреНрд╖рд╛рдПрдВ рдвреВрдВрдвреЗрдВ
рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЙрдкрдХрд░рдг рдХреА рдЬрд░реВрд░рдд рд╣реИ
gettext ред рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрд░реА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╣рдо utf-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреЗрдВрд╢рди .po рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдЕрдЬрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрдЬрд╛рдпред рдпрд╣реА рд╣реИ, __init__.py рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд┐рдирд╛, рдЕрдиреНрдпрдерд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред
рдЕрдЧрд▓рд╛, рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдЙрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкрд░ рдЬрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд▓реЛрдХреЗрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ
python manage.py makemessages -l ru
рдЬрдм рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рдмреНрджрдХреЛрд╢ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ django.po рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рд┐рдд рдХреА рдЬрд╛рдПрдЧреА, рдЬреЛ рд╕реНрдерд╛рдиреАрдп / ru / LC_MESSAGES рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЖрдк рдХреЛрдб рдореЗрдВ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк django.po рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рд╛рде рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдХрд░рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдЪрд▓рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
python manage.py compilemessages
рдЬрд┐рд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж django.mo django.po рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдЧреЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдЖрд╡реЗрджрди рдХрд╛ рдирд╛рдо рдЕрдиреБрд╡рд╛рдж
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╛рдо рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЛ рд░реВрд╕реА рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдордВрдЪреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рдореЙрдбрд▓ рдореЗрдВ рдореЗрдЯрд╛ рдЙрдкрд╡рд░реНрдЧ рдХреЗ app_label рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рддреБрд░рдВрдд рдЗрд╕реЗ рдордирд╛ рдХрд░ рджрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди url рдмрджрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ syncdb рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реБрдИрдВред рд╕реНрдЯреНрд░реИрдЯ рдХреЗ рдЯрд╛рдЗрдЯрд▓ рдореЗрдердб рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реА, рдХреНрдпреЛрдВрдХрд┐ рдлрд┐рд▓реНрдЯрд░ рдЙрдбрд╝ рдЧрдпрд╛ рдФрд░ рдПрдбрдорд┐рди-рдЯреВрд▓реНрд╕ рдиреЗ рд╕рднреА рдореЙрдбрд▓реНрд╕ рдХреЛ рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рд░рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред
рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп makemessages рдХрдорд╛рдВрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЬрдЧрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╢рдмреНрджрдХреЛрд╢ рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реВрдВ рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА __init__.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реВрдВ
from django.utils.translation import ugettext_lazy as _ _('Feedback')
рдпрд╣рд╛рдВ рд╣рдо ugettext_lazy рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдлрд┐рд░ makemessages рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ django.po рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛
#: feedback/__init__.py:2
msgid "Feedback"
msgstr ""
рдФрд░ рд╣рдо рдЕрдкрдиреЗ рдЕрдиреБрд╡рд╛рдж рдХреЛ FTP рдореЗрдВ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛"ред рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд╛рдо рд╣рдорд╛рд░реЗ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ app_list.html рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ AppList рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдорд╛рд░реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ рдФрд░ app_list.html рдлрд╝рд╛рдЗрд▓ рд╡рд╣рд╛рдВ рд░рдЦреЗрдВ рддрд╛рдХрд┐ рд╣рдореЗрдВ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЬрд╛рдП
templates/admin_tools/dashboard/modules/add_list.html
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
рдореВрд▓ app_list.html рдЬреИрд╕реА рд╕рд╛рдордЧреНрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдм рдХреЛрдб рдХреЛ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ 5 рдореЗрдВ рдмрджрд▓реЗрдВ
<h3><a href="{{ child.url }}">{% trans child.title %}</a></h3>
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд╛рдо рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд╣рдорд╛рд░рд╛ рдореВрд▓реНрдп рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдореЗрдВ, рдирд╛рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╕реНрд╡рдпрдВ рдЖрд╡реЗрджрди рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддрдм рднреА рдореЙрдбреНрдпреВрд▓ рд╣реЗрдбрд░ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдбреИрд╢рдмреЛрд░реНрдб рдПрд░реЛ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛, рдФрд░ рд╡рд╣рд╛рдВ CustomAppIndexDashboard рдХреНрд▓рд╛рд╕ рдЦреЛрдЬреЗрдВред рд╡рд╣ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬ рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрдирдХреА __in___ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ
self.children += [ modules.ModelList(_(self.app_title), self.models),
рдпрд╣рд╛рдБ рд╣рдордиреЗ ugettext_lazy рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ self.app_title рд▓рдкреЗрдЯрд╛ рд╣реИ рдФрд░ рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрда рдкрд░ рдирд╛рдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЗрд╡рд▓ рд░реЛрдЯреА рдХреЗ рдЯреБрдХрдбрд╝реЗ рд░рд╣ рдЧрдПред рдореВрд▓ рдирд╛рдо рдЕрднреА рднреА рд╡рд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИред
рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ django.contrib.admin рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдВрдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдРрд╕реА рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рдерд╛ред рдпрд╣ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА admin.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдореЙрдбрд▓ рдХреЛ рджреЗрдЦрдиреЗ, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╢реАрд░реНрд╖рдХ рдХрд╛ рднреА рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдиреАрдЪреЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from django.utils.text import capfirst from django.db.models.base import ModelBase from django.conf import settings from pymorphy import get_morph morph = get_morph(settings.PYMORPHY_DICTS['ru']['dir']) class I18nLabel(): def __init__(self, function): self.target = function self.app_label = u'' def rename(self, f, name = u''): def wrapper(*args, **kwargs): extra_context = kwargs.get('extra_context', {}) if 'delete_view' != f.__name__: extra_context['title'] = self.get_title_by_name(f.__name__, args[1], name) else: extra_context['object_name'] = morph.inflect_ru(name, u'').lower() kwargs['extra_context'] = extra_context return f(*args, **kwargs) return wrapper def get_title_by_name(self, name, request={}, obj_name = u''): if 'add_view' == name: return _('Add %s') % morph.inflect_ru(obj_name, u',').lower() elif 'change_view' == name: return _('Change %s') % morph.inflect_ru(obj_name, u',').lower() elif 'changelist_view' == name: if 'pop' in request.GET: title = _('Select %s') else: title = _('Select %s to change') return title % morph.inflect_ru(obj_name, u',').lower() else: return '' def wrapper_register(self, model_or_iterable, admin_class=None, **option): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if admin_class is None: admin_class = type(model.__name__+'Admin', (admin.ModelAdmin,), {}) self.app_label = model._meta.app_label current_name = model._meta.verbose_name.upper() admin_class.add_view = self.rename(admin_class.add_view, current_name) admin_class.change_view = self.rename(admin_class.change_view, current_name) admin_class.changelist_view = self.rename(admin_class.changelist_view, current_name) admin_class.delete_view = self.rename(admin_class.delete_view, current_name) return self.target(model, admin_class, **option) def wrapper_app_index(self, request, app_label, extra_context=None): if extra_context is None: extra_context = {} extra_context['title'] = _('%s administration') % _(capfirst(app_label)) return self.target(request, app_label, extra_context) def register(self): return self.wrapper_register def index(self): return self.wrapper_app_index admin.site.register = I18nLabel(admin.site.register).register() admin.site.app_index = I18nLabel(admin.site.app_index).index()
: from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from django.utils.text import capfirst from django.db.models.base import ModelBase from django.conf import settings from pymorphy import get_morph morph = get_morph(settings.PYMORPHY_DICTS['ru']['dir']) class I18nLabel(): def __init__(self, function): self.target = function self.app_label = u'' def rename(self, f, name = u''): def wrapper(*args, **kwargs): extra_context = kwargs.get('extra_context', {}) if 'delete_view' != f.__name__: extra_context['title'] = self.get_title_by_name(f.__name__, args[1], name) else: extra_context['object_name'] = morph.inflect_ru(name, u'').lower() kwargs['extra_context'] = extra_context return f(*args, **kwargs) return wrapper def get_title_by_name(self, name, request={}, obj_name = u''): if 'add_view' == name: return _('Add %s') % morph.inflect_ru(obj_name, u',').lower() elif 'change_view' == name: return _('Change %s') % morph.inflect_ru(obj_name, u',').lower() elif 'changelist_view' == name: if 'pop' in request.GET: title = _('Select %s') else: title = _('Select %s to change') return title % morph.inflect_ru(obj_name, u',').lower() else: return '' def wrapper_register(self, model_or_iterable, admin_class=None, **option): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if admin_class is None: admin_class = type(model.__name__+'Admin', (admin.ModelAdmin,), {}) self.app_label = model._meta.app_label current_name = model._meta.verbose_name.upper() admin_class.add_view = self.rename(admin_class.add_view, current_name) admin_class.change_view = self.rename(admin_class.change_view, current_name) admin_class.changelist_view = self.rename(admin_class.changelist_view, current_name) admin_class.delete_view = self.rename(admin_class.delete_view, current_name) return self.target(model, admin_class, **option) def wrapper_app_index(self, request, app_label, extra_context=None): if extra_context is None: extra_context = {} extra_context['title'] = _('%s administration') % _(capfirst(app_label)) return self.target(request, app_label, extra_context) def register(self): return self.wrapper_register def index(self): return self.wrapper_app_index admin.site.register = I18nLabel(admin.site.register).register() admin.site.app_index = I18nLabel(admin.site.app_index).index()
) from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from django.utils.text import capfirst from django.db.models.base import ModelBase from django.conf import settings from pymorphy import get_morph morph = get_morph(settings.PYMORPHY_DICTS['ru']['dir']) class I18nLabel(): def __init__(self, function): self.target = function self.app_label = u'' def rename(self, f, name = u''): def wrapper(*args, **kwargs): extra_context = kwargs.get('extra_context', {}) if 'delete_view' != f.__name__: extra_context['title'] = self.get_title_by_name(f.__name__, args[1], name) else: extra_context['object_name'] = morph.inflect_ru(name, u'').lower() kwargs['extra_context'] = extra_context return f(*args, **kwargs) return wrapper def get_title_by_name(self, name, request={}, obj_name = u''): if 'add_view' == name: return _('Add %s') % morph.inflect_ru(obj_name, u',').lower() elif 'change_view' == name: return _('Change %s') % morph.inflect_ru(obj_name, u',').lower() elif 'changelist_view' == name: if 'pop' in request.GET: title = _('Select %s') else: title = _('Select %s to change') return title % morph.inflect_ru(obj_name, u',').lower() else: return '' def wrapper_register(self, model_or_iterable, admin_class=None, **option): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if admin_class is None: admin_class = type(model.__name__+'Admin', (admin.ModelAdmin,), {}) self.app_label = model._meta.app_label current_name = model._meta.verbose_name.upper() admin_class.add_view = self.rename(admin_class.add_view, current_name) admin_class.change_view = self.rename(admin_class.change_view, current_name) admin_class.changelist_view = self.rename(admin_class.changelist_view, current_name) admin_class.delete_view = self.rename(admin_class.delete_view, current_name) return self.target(model, admin_class, **option) def wrapper_app_index(self, request, app_label, extra_context=None): if extra_context is None: extra_context = {} extra_context['title'] = _('%s administration') % _(capfirst(app_label)) return self.target(request, app_label, extra_context) def register(self): return self.wrapper_register def index(self): return self.wrapper_app_index admin.site.register = I18nLabel(admin.site.register).register() admin.site.app_index = I18nLabel(admin.site.app_index).index()
рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП') from django.contrib import admin from django.utils.translation import ugettext_lazy as _ from django.utils.text import capfirst from django.db.models.base import ModelBase from django.conf import settings from pymorphy import get_morph morph = get_morph(settings.PYMORPHY_DICTS['ru']['dir']) class I18nLabel(): def __init__(self, function): self.target = function self.app_label = u'' def rename(self, f, name = u''): def wrapper(*args, **kwargs): extra_context = kwargs.get('extra_context', {}) if 'delete_view' != f.__name__: extra_context['title'] = self.get_title_by_name(f.__name__, args[1], name) else: extra_context['object_name'] = morph.inflect_ru(name, u'').lower() kwargs['extra_context'] = extra_context return f(*args, **kwargs) return wrapper def get_title_by_name(self, name, request={}, obj_name = u''): if 'add_view' == name: return _('Add %s') % morph.inflect_ru(obj_name, u',').lower() elif 'change_view' == name: return _('Change %s') % morph.inflect_ru(obj_name, u',').lower() elif 'changelist_view' == name: if 'pop' in request.GET: title = _('Select %s') else: title = _('Select %s to change') return title % morph.inflect_ru(obj_name, u',').lower() else: return '' def wrapper_register(self, model_or_iterable, admin_class=None, **option): if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if admin_class is None: admin_class = type(model.__name__+'Admin', (admin.ModelAdmin,), {}) self.app_label = model._meta.app_label current_name = model._meta.verbose_name.upper() admin_class.add_view = self.rename(admin_class.add_view, current_name) admin_class.change_view = self.rename(admin_class.change_view, current_name) admin_class.changelist_view = self.rename(admin_class.changelist_view, current_name) admin_class.delete_view = self.rename(admin_class.delete_view, current_name) return self.target(model, admin_class, **option) def wrapper_app_index(self, request, app_label, extra_context=None): if extra_context is None: extra_context = {} extra_context['title'] = _('%s administration') % _(capfirst(app_label)) return self.target(request, app_label, extra_context) def register(self): return self.wrapper_register def index(self): return self.wrapper_app_index admin.site.register = I18nLabel(admin.site.register).register() admin.site.app_index = I18nLabel(admin.site.app_index).index()
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ ugettext_lazy рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдФрд░ рдкреГрд╖реНрда рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдЖрд╡реЗрджрди рдХрд╛ рдирд╛рдо рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдФрд░
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / app_index.html рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрдВрдХреНрддрд┐ 11 рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛
{% trans app.name %}
рдпрд╣ рдХреЗрд╡рд▓ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рдореЗрдиреВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирд╛рдо рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
admin_tools / menu / item.html рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ
рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВред I18n рдХреЛ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓реЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ 5 рд╡реАрдВ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо {{item.title}} рдХреЗ рдмрдЬрд╛рдп {% trans item.title%} рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдирд╛рдо django.mo рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗред рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рдЦреЗрддреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж
рдпрджрд┐ рдЖрд╡реЗрджрди рдХрд╛ рдирд╛рдо рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдиреБрд╡рд╛рджрд┐рдд рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо рдорд╛рдорд▓реЗ, рд▓рд┐рдВрдЧ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореИрдВ
kmike рд╕реЗ рдПрдХ рдмрд╣реБрдд рдЦреВрдмрд╕реВрд░рдд
pymorphy рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП
рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдЪреНрдЪ рдЧрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд░рд╣рддрд╛ рд╣реИ,
рд╡рд╣ рд╣реИ рдкрд╛рдпрд░реЛрдлрд╝реНрдлрд╝ рдореЙрдбреНрдпреВрд▓ рдХреЛ
рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░
рдЗрд╕реЗ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЪрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд
django рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ ред
рдЕрдм рд╣рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдХрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдкреЗрдореНрдлрд░реНрдлреА рдлрд┐рд▓реНрдЯрд░ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╕рднреА рд▓рд╛рдЗрди рдлреАрдб рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд░реНрдерд╛рддреН рдлрд╝рд╛рдЗрд▓ django.poред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд┐рдХреНрдЪрд░ рдореЙрдбрд▓ рдХреЛ рд░рд╕реЗрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕реЗ "рдкрд┐рдХреНрдЪрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕ рдореЙрдбрд▓ рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рдд рд▓рд┐рдЦрдирд╛ рд╣реИ
class Picture(models.Model): title = models.CharField(max_length=255, verbose_name=_('title')) ... class Meta: verbose_name = _(u'picture') verbose_name_plural = _(u'pictures')
рдФрд░ django.po рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
msgid "picture"
msgstr ""
msgid "pictures"
msgstr ""
msgid "title"
msgstr ""
рдЕрдм рдпрд╣ рдорд╛рдорд▓рд╛ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЕрдиреБрд╡рд╛рджрд┐рдд рд╢рдмреНрджреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ
рдЪрд▓рд┐рдП
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / change_list.html рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рдореЙрдбрд▓ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓реЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ pymorphy_tags рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдВрдХреНрддрд┐ 2 рдореЗрдВред рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
{% load adminmedia admin_list i18n pymorphy_tags %}
рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд╣рд╛рдВ 64 рд▓рд╛рдЗрди рдкрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдРрдб рдмрдЯрди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВ
{% blocktrans with cl.opts.verbose_name|inflect:"" as name %}Add {{ name }}{% endblocktrans %}
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЖрд░реЛрдк рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рдирд╛рдо рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ред рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдорд┐рд▓рд╛ "рдЪрд┐рддреНрд░ рдЬреЛрдбрд╝реЗрдВ"ред рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдБ рдкрдврд╝реЗрдВред
рдкреГрд╖реНрда рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА I18nLabel рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣реА рд░реВрдк рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЖрдЧреЗ рдмрдврд╝ рд╕рдХреЗрдВред
рдЕрдм рдУрд╡рд░рд▓реЛрдб рдЯреЗрдореНрдкрд▓реЗрдЯ
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / change_form.html ред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд▓реЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ pymorphy_tags рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрдВрдХреНрддрд┐ 22 рдореЗрдВ рдЬрдЧрд╣ рдХрд░рдХреЗ рдмреНрд░реЗрдбрдХреНрд░рдВрдм рдХреЛ рдареАрдХ рдХрд░реЗрдВ
{{ opts.verbose_name }}
рдкрд░
{{ opts.verbose_name|inflect:"" }}
рд╕реВрдЪреА рдореЗрдВ рдЕрдЧрд▓рд╛
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / delete_selected_confirmation.html рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ ред рдЗрд╕рдореЗрдВ, рд╣рдо рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣ рд╣реА рд╕рднреА рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
{% trans app_label|capfirst %}
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, delete_selected рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, extra_context рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рджреБрдЦреА рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдмрдирд╛рдпрд╛, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред
from django import template from django.conf import settings from pymorphy import get_morph register = template.Library() morph = get_morph(settings.PYMORPHY_DICTS['ru']['dir']) @register.filter def plural_from_object(source, object): l = len(object[0]) if 1 == l: return source return morph.pluralize_inflected_ru(source.upper(), l).lower()
рдЕрдм рд╕рднреА рдЬрдЧрд╣реЛрдВ рдкрд░ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреНрд▓реЙрдХрдЪреЗрди рдмреНрд▓реЙрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
{% blocktrans %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktrans %}
рдареАрдХ рдХрд░рдирд╛
{% blocktrans with objects_name|inflect:""|plural_from_object:deletable_objects as objects_name %}Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:{% endblocktrans %}
рдпрд╣ рд╕рдм рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдкреЗрдЬрд┐рдиреЗрд╢рди.html
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рдореЗрдВ pymorphy_tags рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди 9 рдХреЛ рдмрджрд▓реЗрдВ
{{ cl.result_count }} {{ cl.opts.verbose_name|lower|plural:cl.result_count }}
рдореИрдВрдиреЗ рдПрдХ рдХрдо рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрд╡рдЪрди рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдЧреЗрдЯрдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЕрдЧрд▓рд╛
рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / filter.html рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд╣рд▓реЗ рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдорд╛рди рд╕рд░рд▓ рд╣реИред
{% load i18n pymorphy_tags %}
<h3>{% blocktrans with title|inflect:"" as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджреЗрд╢ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдХрд╖реНрдЯрдкреНрд░рдж рдЕрдиреНрдпрд╛рдп рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ModelAdmin рд╡рд░реНрдЧ рдХреЗ message_user рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕ рдХреЛ admin.py рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛
def message_wrapper(f): def wrapper(self, request, message): gram_info = morph.get_graminfo( self.model._meta.verbose_name.upper() )[0] if -1 != message.find(u'"'): """ Message about some action with a single element """ words = [w for w in re.split("( |\\\".*?\\\".*?)", message) if w.strip()] form = gram_info['info'][:gram_info['info'].find(',')] message = u' '.join(words[:2]) for word in words[2:]: if not word.isdigit(): word = word.replace(".", "").upper() try: info = morph.get_graminfo(word)[0] if u'_' != info['class']: word = morph.inflect_ru(word, form).lower() elif 0 <= info['info'].find(u''): word = morph.inflect_ru(word, form, u'_').lower() else: word = word.lower() except IndexError: word = word.lower() message += u' ' + word else: """ Message about some action with a group of elements """ num = int(re.search("\d", message).group(0)) words = message.split(u' ') message = words[0] pos = gram_info['info'].find(',') form = gram_info['info'][:pos] + u',' + u'' if 1 == num else u'' for word in words[1:]: if not word.isdigit(): word = word.replace(".", "").upper() info = morph.get_graminfo(word)[0] if u'_' != info['class']: word = morph.pluralize_inflected_ru(word, num).lower() else: word = morph.inflect_ru(word, form, u'_').lower() message += u' ' + word message += '.' return f(self, request, capfirst(message)) return wrapper admin.ModelAdmin.message_user = message_wrapper(admin.ModelAdmin.message_user)
рдпрд╣рд╛рдБ рд╣рдо рд╕рдВрджреЗрд╢ рдХреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдФрд░ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджреЗрд╢ред
рдЕрдм рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдирд┐рд╖реНрдХрд░реНрд╖
Django рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рдХрдореА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рд╣рдорд╛рд░реЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИред рд╢рд╛рдпрдж рдХреБрдЫ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдЯреЗрдврд╝реЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рддрдХ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рдмрд┐рдВрджреБ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдкрд╛рда рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзреАрди рд╣реИред
рдЗрд╕ рдХрд╛рдо рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдФрд░ рд╕рднреА рдЕрдиреБрд╡рд╛рджрд┐рдд рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╕рд╣реЗрдЬрдирд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН рдПрдХ рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рд╛ред
рдореИрдВ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪ рдЖрдк
рдпрд╣рд╛рдВ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЦрд╛рдХреЗ
рдЙрдард╛ рд╕рдХрддреЗ
рд╣реИрдВ ред рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЕрдирдЬрд╝рд┐рдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
[UPD]: рдорд╛рдЗрдХрд▓ (
рдХрд┐рдореАрдЗрдХ ) рдиреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
django- Russian -admin рдирд╛рдордХ рдПрдХ
рдмрд┐рдЯрдмрдХреЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреАред