Index: django/templatetags/i18n.py
===================================================================
--- django/templatetags/i18n.py	(revision 7671)
+++ django/templatetags/i18n.py	(working copy)
@@ -3,6 +3,7 @@
 from django.template import Node, Variable, VariableNode
 from django.template import TemplateSyntaxError, TokenParser, Library
 from django.template import TOKEN_TEXT, TOKEN_VAR
+from django.template.defaulttags import URLNode
 from django.utils import translation
 from django.utils.encoding import force_unicode
 
@@ -218,6 +219,24 @@
                         raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'with value as variable'"
                     extra_context[self.tag()] = VariableNode(
                             parser.compile_filter(value))
+                elif tag == 'url':
+                    args = []
+                    kwargs = {}
+                    value = self.value()
+                    next_tag = self.tag()
+                    if next_tag != 'as':
+                        if self.tag() != 'as':
+                            raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'url path.to.some_view arg1,arg2,name1=value1 as variable'"
+                        else:
+                            # can't find  way to do not duplicate code from url tag
+                            for arg in next_tag.split(','):
+                                if '=' in arg:
+                                    k, v = arg.split('=', 1)
+                                    k = k.strip()
+                                    kwargs[k] = parser.compile_filter(v)
+                                else:
+                                    args.append(parser.compile_filter(arg))
+                    extra_context[self.tag()] = URLNode(value, args, kwargs)
                 elif tag == 'count':
                     counter = parser.compile_filter(self.value())
                     if self.tag() != 'as':
Index: tests/regressiontests/templates/tests.py
===================================================================
--- tests/regressiontests/templates/tests.py	(revision 7671)
+++ tests/regressiontests/templates/tests.py	(working copy)
@@ -735,28 +735,36 @@
             # translation of plural form
             'i18n08': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}{{ counter }} plural{% endblocktrans %}', {'number': 2}, "2 plural"),
 
+            # translation with an url (same as url tag below)
+            'i18n09' : ('{% load i18n %}{% blocktrans url regressiontests.templates.views.client client.id as url %}<a href="{{ url }}" title="">link</a>{% endblocktrans %}', {'client': {'id': 1}}, '<a href="/url_tag/client/1/" title="">link</a>'),
+            'i18n10' : ('{% load i18n %}{% blocktrans url regressiontests.templates.views.client_action client.id,action="update" as url %}<a href="{{ url }}" title="">link</a>{% endblocktrans %}', {'client': {'id': 1}}, '<a href="/url_tag/client/1/update/" title="">link</a>'),
+            'i18n11' : ('{% load i18n %}{% blocktrans url regressiontests.templates.views.index as url %}<a href="{{ url }}" title="">link</a>{% endblocktrans %}', {}, '<a href="/url_tag/" title="">link</a>'),
+            'i18n12' : ('{% load i18n %}{% blocktrans url named.client client.id as url %}<a href="{{ url }}" title="">link</a>{% endblocktrans %}', {'client': {'id': 1}}, '<a href="/url_tag/named-client/1/" title="">link</a>'),
+            'i18n13' : (u'{% load i18n %}{% blocktrans url метка_оператора v as url %}<a href="{{ url }}" title="">link</a>{% endblocktrans %}', {'v': u'Ω'},
+                    '<a href="/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/" title="">link</a>'),
+
             # simple non-translation (only marking) of a string to german
-            'i18n09': ('{% load i18n %}{% trans "Page not found" noop %}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
+            'i18n14': ('{% load i18n %}{% trans "Page not found" noop %}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
 
             # translation of a variable with a translated filter
-            'i18n10': ('{{ bool|yesno:_("yes,no,maybe") }}', {'bool': True, 'LANGUAGE_CODE': 'de'}, 'Ja'),
+            'i18n15': ('{{ bool|yesno:_("yes,no,maybe") }}', {'bool': True, 'LANGUAGE_CODE': 'de'}, 'Ja'),
 
             # translation of a variable with a non-translated filter
-            'i18n11': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'),
+            'i18n16': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'),
 
             # usage of the get_available_languages tag
-            'i18n12': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'),
+            'i18n17': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'),
 
             # translation of constant strings
-            'i18n13': ('{{ _("Password") }}', {'LANGUAGE_CODE': 'de'}, 'Passwort'),
-            'i18n14': ('{% cycle "foo" _("Password") _(\'Password\') as c %} {% cycle c %} {% cycle c %}', {'LANGUAGE_CODE': 'de'}, 'foo Passwort Passwort'),
-            'i18n15': ('{{ absent|default:_("Password") }}', {'LANGUAGE_CODE': 'de', 'absent': ""}, 'Passwort'),
-            'i18n16': ('{{ _("<") }}', {'LANGUAGE_CODE': 'de'}, '<'),
+            'i18n18': ('{{ _("Password") }}', {'LANGUAGE_CODE': 'de'}, 'Passwort'),
+            'i18n19': ('{% cycle "foo" _("Password") _(\'Password\') as c %} {% cycle c %} {% cycle c %}', {'LANGUAGE_CODE': 'de'}, 'foo Passwort Passwort'),
+            'i18n20': ('{{ absent|default:_("Password") }}', {'LANGUAGE_CODE': 'de', 'absent': ""}, 'Passwort'),
+            'i18n21': ('{{ _("<") }}', {'LANGUAGE_CODE': 'de'}, '<'),
 
             # Escaping inside blocktrans works as if it was directly in the
             # template.
-            'i18n17': ('{% load i18n %}{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
-            'i18n18': ('{% load i18n %}{% blocktrans with anton|force_escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
+            'i18n22': ('{% load i18n %}{% blocktrans with anton|escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
+            'i18n23': ('{% load i18n %}{% blocktrans with anton|force_escape as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'α & β'}, u'α &amp; β'),
 
             ### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################
 

Index: docs/i18n.txt
===================================================================
--- docs/i18n.txt	(revision 7671)
+++ docs/i18n.txt	(working copy)
@@ -260,6 +260,13 @@
     There are {{ counter }} {{ name }} objects.
     {% endblocktrans %}
 
+**New in development version:** If you need to use `url template tag`_, you 
+can specify it within ``{% blocktrans %}``, as ``count`` above. Example::
+
+    {% blocktrans url path.to.some_view arg1,arg2,name1=value1 as myurl %}
+    This is a <a href="{{ myurl }}" title="">link</a>.
+    {% endblocktrans %}
+
 Internally, all block and inline translations use the appropriate
 ``ugettext`` / ``ungettext`` call.
 
@@ -301,6 +308,7 @@
     (keeping the comma intact).
 
 .. _Django templates: ../templates_python/
+.. _url template tag: ../templates/#url
 
 Working with lazy translation objects
 -------------------------------------
