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()

```

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(
             {

{"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"}]}