prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Tags field needs universal help text to explain need to quote multi-word tags
  Wagtail's tagging system requires multi-word tags to be quoted, to prevent a two-word tag becoming two separate tags. This appears to catch users out repeatedly and has generated several Issues in recent months.
  
  The tag field widget, wherever used (page models, images, documents etc) should have standard help text (appearing beneath it like all help text) explaining the need for quoting. Explaining the need for comma-delimiting might also be worth adding while we're at it.
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `wagtail/admin/widgets/tags.py`
  Content:
  ```
  1 import json
  2 
  3 from django.conf import settings
  4 from django.urls import reverse
  5 from taggit.forms import TagWidget
  6 from taggit.models import Tag
  7 
  8 
  9 class AdminTagWidget(TagWidget):
  10     template_name = "wagtailadmin/widgets/tag_widget.html"
  11 
  12     def __init__(self, *args, **kwargs):
  13         self.tag_model = kwargs.pop("tag_model", Tag)
  14         # free_tagging = None means defer to the tag model's setting
  15         self.free_tagging = kwargs.pop("free_tagging", None)
  16         super().__init__(*args, **kwargs)
  17 
  18     def get_context(self, name, value, attrs):
  19         context = super().get_context(name, value, attrs)
  20 
  21         if self.tag_model == Tag:
  22             autocomplete_url = reverse("wagtailadmin_tag_autocomplete")
  23         else:
  24             autocomplete_url = reverse(
  25                 "wagtailadmin_tag_model_autocomplete",
  26                 args=(self.tag_model._meta.app_label, self.tag_model._meta.model_name),
  27             )
  28 
  29         if self.free_tagging is None:
  30             free_tagging = getattr(self.tag_model, "free_tagging", True)
  31         else:
  32             free_tagging = self.free_tagging
  33 
  34         context["widget"]["autocomplete_url"] = autocomplete_url
  35         context["widget"]["options_json"] = json.dumps(
  36             {
  37                 "allowSpaces": getattr(settings, "TAG_SPACES_ALLOWED", True),
  38                 "tagLimit": getattr(settings, "TAG_LIMIT", None),
  39                 "autocompleteOnly": not free_tagging,
  40             }
  41         )
  42 
  43         return context
  44
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/wagtail/admin/widgets/tags.py b/wagtail/admin/widgets/tags.py
  --- a/wagtail/admin/widgets/tags.py
  +++ b/wagtail/admin/widgets/tags.py
  @@ -2,6 +2,7 @@
   
   from django.conf import settings
   from django.urls import reverse
  +from django.utils.translation import gettext_lazy as _
   from taggit.forms import TagWidget
   from taggit.models import Tag
   
  @@ -31,6 +32,15 @@
           else:
               free_tagging = self.free_tagging
   
  +        tag_spaces_allowed = getattr(settings, "TAG_SPACES_ALLOWED", True)
  +        if tag_spaces_allowed:
  +            help_text = _(
  +                'Multi-word tags with spaces will automatically be enclosed in double quotes (").'
  +            )
  +        else:
  +            help_text = _("Tags can only consist of a single word, no spaces allowed.")
  +
  +        context["widget"]["help_text"] = help_text
           context["widget"]["autocomplete_url"] = autocomplete_url
           context["widget"]["options_json"] = json.dumps(
               {
  
verification_info: {"golden_diff": "diff --git a/wagtail/admin/widgets/tags.py b/wagtail/admin/widgets/tags.py\n--- a/wagtail/admin/widgets/tags.py\n+++ b/wagtail/admin/widgets/tags.py\n@@ -2,6 +2,7 @@\n \n from django.conf import settings\n from django.urls import reverse\n+from django.utils.translation import gettext_lazy as _\n from taggit.forms import TagWidget\n from taggit.models import Tag\n \n@@ -31,6 +32,15 @@\n         else:\n             free_tagging = self.free_tagging\n \n+        tag_spaces_allowed = getattr(settings, \"TAG_SPACES_ALLOWED\", True)\n+        if tag_spaces_allowed:\n+            help_text = _(\n+                'Multi-word tags with spaces will automatically be enclosed in double quotes (\").'\n+            )\n+        else:\n+            help_text = _(\"Tags can only consist of a single word, no spaces allowed.\")\n+\n+        context[\"widget\"][\"help_text\"] = help_text\n         context[\"widget\"][\"autocomplete_url\"] = autocomplete_url\n         context[\"widget\"][\"options_json\"] = json.dumps(\n             {\n", "issue": "Tags field needs universal help text to explain need to quote multi-word tags\nWagtail's tagging system requires multi-word tags to be quoted, to prevent a two-word tag becoming two separate tags. This appears to catch users out repeatedly and has generated several Issues in recent months.\n\nThe tag field widget, wherever used (page models, images, documents etc) should have standard help text (appearing beneath it like all help text) explaining the need for quoting. Explaining the need for comma-delimiting might also be worth adding while we're at it.\n\n", "before_files": [{"content": "import json\n\nfrom django.conf import settings\nfrom django.urls import reverse\nfrom taggit.forms import TagWidget\nfrom taggit.models import Tag\n\n\nclass AdminTagWidget(TagWidget):\n    template_name = \"wagtailadmin/widgets/tag_widget.html\"\n\n    def __init__(self, *args, **kwargs):\n        self.tag_model = kwargs.pop(\"tag_model\", Tag)\n        # free_tagging = None means defer to the tag model's setting\n        self.free_tagging = kwargs.pop(\"free_tagging\", None)\n        super().__init__(*args, **kwargs)\n\n    def get_context(self, name, value, attrs):\n        context = super().get_context(name, value, attrs)\n\n        if self.tag_model == Tag:\n            autocomplete_url = reverse(\"wagtailadmin_tag_autocomplete\")\n        else:\n            autocomplete_url = reverse(\n                \"wagtailadmin_tag_model_autocomplete\",\n                args=(self.tag_model._meta.app_label, self.tag_model._meta.model_name),\n            )\n\n        if self.free_tagging is None:\n            free_tagging = getattr(self.tag_model, \"free_tagging\", True)\n        else:\n            free_tagging = self.free_tagging\n\n        context[\"widget\"][\"autocomplete_url\"] = autocomplete_url\n        context[\"widget\"][\"options_json\"] = json.dumps(\n            {\n                \"allowSpaces\": getattr(settings, \"TAG_SPACES_ALLOWED\", True),\n                \"tagLimit\": getattr(settings, \"TAG_LIMIT\", None),\n                \"autocompleteOnly\": not free_tagging,\n            }\n        )\n\n        return context\n", "path": "wagtail/admin/widgets/tags.py"}], "after_files": [{"content": "import json\n\nfrom django.conf import settings\nfrom django.urls import reverse\nfrom django.utils.translation import gettext_lazy as _\nfrom taggit.forms import TagWidget\nfrom taggit.models import Tag\n\n\nclass AdminTagWidget(TagWidget):\n    template_name = \"wagtailadmin/widgets/tag_widget.html\"\n\n    def __init__(self, *args, **kwargs):\n        self.tag_model = kwargs.pop(\"tag_model\", Tag)\n        # free_tagging = None means defer to the tag model's setting\n        self.free_tagging = kwargs.pop(\"free_tagging\", None)\n        super().__init__(*args, **kwargs)\n\n    def get_context(self, name, value, attrs):\n        context = super().get_context(name, value, attrs)\n\n        if self.tag_model == Tag:\n            autocomplete_url = reverse(\"wagtailadmin_tag_autocomplete\")\n        else:\n            autocomplete_url = reverse(\n                \"wagtailadmin_tag_model_autocomplete\",\n                args=(self.tag_model._meta.app_label, self.tag_model._meta.model_name),\n            )\n\n        if self.free_tagging is None:\n            free_tagging = getattr(self.tag_model, \"free_tagging\", True)\n        else:\n            free_tagging = self.free_tagging\n\n        tag_spaces_allowed = getattr(settings, \"TAG_SPACES_ALLOWED\", True)\n        if tag_spaces_allowed:\n            help_text = _(\n                'Multi-word tags with spaces will automatically be enclosed in double quotes (\").'\n            )\n        else:\n            help_text = _(\"Tags can only consist of a single word, no spaces allowed.\")\n\n        context[\"widget\"][\"help_text\"] = help_text\n        context[\"widget\"][\"autocomplete_url\"] = autocomplete_url\n        context[\"widget\"][\"options_json\"] = json.dumps(\n            {\n                \"allowSpaces\": getattr(settings, \"TAG_SPACES_ALLOWED\", True),\n                \"tagLimit\": getattr(settings, \"TAG_LIMIT\", None),\n                \"autocompleteOnly\": not free_tagging,\n            }\n        )\n\n        return context\n", "path": "wagtail/admin/widgets/tags.py"}]}