diff -pruN 8.0.0-1/.github/workflows/check.yml 8.1.0-1/.github/workflows/check.yml
--- 8.0.0-1/.github/workflows/check.yml	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/.github/workflows/check.yml	2025-04-10 08:12:54.000000000 +0000
@@ -13,11 +13,9 @@ jobs:
       fail-fast: false
       matrix:
         tox-environment:
-          - black
           - doctest
-          - flake8
-          - isort
           - mypy
+          - ruff
     env:
       TOXENV: ${{ matrix.tox-environment }}
 
@@ -26,6 +24,9 @@ jobs:
 
       - name: Set up Python
         uses: actions/setup-python@v5
+        with:
+          python-version: "3.x"
+          cache: pip
 
       - name: Install dependencies
         run: python -m pip install tox
diff -pruN 8.0.0-1/.github/workflows/release.yml 8.1.0-1/.github/workflows/release.yml
--- 8.0.0-1/.github/workflows/release.yml	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/.github/workflows/release.yml	2025-04-10 08:12:54.000000000 +0000
@@ -14,6 +14,7 @@ jobs:
         uses: actions/setup-python@v5
         with:
           python-version: "3.x"
+          cache: pip
 
       - name: Install dependencies
         run: pip install --user build django setuptools twine wheel
diff -pruN 8.0.0-1/.github/workflows/test.yml 8.1.0-1/.github/workflows/test.yml
--- 8.0.0-1/.github/workflows/test.yml	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/.github/workflows/test.yml	2025-04-10 08:12:54.000000000 +0000
@@ -13,28 +13,12 @@ jobs:
       fail-fast: false
       matrix:
         python-version:
-          - 3.8
-          - 3.9
+          - '3.9'
           - '3.10'
           - '3.11'
           - '3.12'
-        tox-environment:
-          - dj32
-          - dj42
-          - dj50
-        include:
-          - python-version: '3.10'
-            tox-environment: djmain
-          - python-version: '3.11'
-            tox-environment: djmain
-          - python-version: '3.12'
-            tox-environment: djmain
-        exclude:
-          - python-version: '3.8'
-            tox-environment: dj50
-          - python-version: '3.9'
-            tox-environment: dj50
-
+          - '3.13'
+          - '3.14-dev'
     env:
       COVERALLS_FLAG_NAME: Python ${{ matrix.python-version }} / ${{ matrix.tox-environment }}
       COVERALLS_PARALLEL: true
@@ -54,9 +38,10 @@ jobs:
         uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
+          cache: pip
 
       - name: Install dependencies
-        run: python -m pip install coveralls tox
+        run: python -m pip install coveralls tox-gh
 
       - name: Run tests
         run: tox
diff -pruN 8.0.0-1/.readthedocs.yaml 8.1.0-1/.readthedocs.yaml
--- 8.0.0-1/.readthedocs.yaml	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/.readthedocs.yaml	2025-04-10 08:12:54.000000000 +0000
@@ -2,9 +2,9 @@
 version: 2
 
 build:
-  os: ubuntu-22.04
+  os: ubuntu-24.04
   tools:
-    python: "3.11"
+    python: "3.13"
 
 python:
   install:
@@ -13,4 +13,5 @@ python:
       path: .
 
 sphinx:
+  configuration: docs/conf.py
   fail_on_warning: yes
diff -pruN 8.0.0-1/debian/changelog 8.1.0-1/debian/changelog
--- 8.0.0-1/debian/changelog	2024-07-18 09:13:41.000000000 +0000
+++ 8.1.0-1/debian/changelog	2025-04-24 10:16:02.000000000 +0000
@@ -1,3 +1,10 @@
+django-phonenumber-field (8.1.0-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream release.
+
+ -- Colin Watson <cjwatson@debian.org>  Thu, 24 Apr 2025 11:16:02 +0100
+
 django-phonenumber-field (8.0.0-1) unstable; urgency=low
 
   * New upstream version 8.0.0
diff -pruN 8.0.0-1/debian/control 8.1.0-1/debian/control
--- 8.0.0-1/debian/control	2024-07-18 09:13:41.000000000 +0000
+++ 8.1.0-1/debian/control	2025-04-24 10:16:02.000000000 +0000
@@ -13,7 +13,7 @@ Build-Depends:
  python-django-doc,
  python3-all,
  python3-babel,
- python3-django,
+ python3-django (>= 3:4.2),
  python3-djangorestframework,
  python3-doc,
  python3-phonenumbers,
diff -pruN 8.0.0-1/debian/patches/0001-Fix-language-and-revision-date-fields.patch 8.1.0-1/debian/patches/0001-Fix-language-and-revision-date-fields.patch
--- 8.0.0-1/debian/patches/0001-Fix-language-and-revision-date-fields.patch	2024-07-18 09:13:41.000000000 +0000
+++ 8.1.0-1/debian/patches/0001-Fix-language-and-revision-date-fields.patch	2025-04-24 10:16:02.000000000 +0000
@@ -8,7 +8,6 @@ Subject: Fix language and revision date
  phonenumber_field/locale/bn/LC_MESSAGES/django.po      | 2 +-
  phonenumber_field/locale/de/LC_MESSAGES/django.po      | 4 ++--
  phonenumber_field/locale/es_AR/LC_MESSAGES/django.po   | 2 +-
- phonenumber_field/locale/fr/LC_MESSAGES/django.po      | 2 +-
  phonenumber_field/locale/he/LC_MESSAGES/django.po      | 4 ++--
  phonenumber_field/locale/hy/LC_MESSAGES/django.po      | 4 ++--
  phonenumber_field/locale/nl/LC_MESSAGES/django.po      | 2 +-
@@ -19,10 +18,10 @@ Subject: Fix language and revision date
  phonenumber_field/locale/sk/LC_MESSAGES/django.po      | 4 ++--
  phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po   | 2 +-
  phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po | 4 ++--
- 16 files changed, 21 insertions(+), 21 deletions(-)
+ 15 files changed, 20 insertions(+), 20 deletions(-)
 
 diff --git a/phonenumber_field/locale/ar/LC_MESSAGES/django.po b/phonenumber_field/locale/ar/LC_MESSAGES/django.po
-index 78b7369..e86aab7 100644
+index 55938e0..60a7849 100644
 --- a/phonenumber_field/locale/ar/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/ar/LC_MESSAGES/django.po
 @@ -12,7 +12,7 @@ msgstr ""
@@ -35,41 +34,41 @@ index 78b7369..e86aab7 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/az/LC_MESSAGES/django.po b/phonenumber_field/locale/az/LC_MESSAGES/django.po
-index cd4a4bc..aa1a07b 100644
+index dd8b80b..a6c609d 100644
 --- a/phonenumber_field/locale/az/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/az/LC_MESSAGES/django.po
 @@ -8,7 +8,7 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: Emin Mastizada <emin@linux.com>\n"
  "Language-Team: Azerbaijani <info@mozillaz.org>\n"
  "Language: az\n"
 diff --git a/phonenumber_field/locale/bn/LC_MESSAGES/django.po b/phonenumber_field/locale/bn/LC_MESSAGES/django.po
-index c781b63..0bca1b7 100644
+index b4a8dbf..6aaf9a7 100644
 --- a/phonenumber_field/locale/bn/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/bn/LC_MESSAGES/django.po
 @@ -8,7 +8,7 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: Tanvir Hasan <tanvir002700@gmail.com>\n"
  "Language-Team: \n"
  "Language: bn\n"
 diff --git a/phonenumber_field/locale/de/LC_MESSAGES/django.po b/phonenumber_field/locale/de/LC_MESSAGES/django.po
-index 0e8e04a..420bf1c 100644
+index e1df9ae..0b40775 100644
 --- a/phonenumber_field/locale/de/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/de/LC_MESSAGES/django.po
 @@ -8,10 +8,10 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
 -"Language: \n"
@@ -78,41 +77,28 @@ index 0e8e04a..420bf1c 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po b/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po
-index 3ef9d1b..b762c1a 100644
+index 728a67b..6d8c6b2 100644
 --- a/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po
 @@ -8,7 +8,7 @@ msgstr ""
  "Project-Id-Version: \n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2020-09-30 10:42-0500\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: \n"
-+"PO-Revision-Date: 2020-09-30 10:42-0500\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: \n"
  "Language-Team: \n"
  "Language: es_AR\n"
-diff --git a/phonenumber_field/locale/fr/LC_MESSAGES/django.po b/phonenumber_field/locale/fr/LC_MESSAGES/django.po
-index 8b5bceb..0d6eccc 100644
---- a/phonenumber_field/locale/fr/LC_MESSAGES/django.po
-+++ b/phonenumber_field/locale/fr/LC_MESSAGES/django.po
-@@ -11,7 +11,7 @@ msgstr ""
- "PO-Revision-Date: 2011-10-19 14:10+0200\n"
- "Last-Translator: Stéphane Raimbault <stephane.raimbault@gmail.com>\n"
- "Language-Team: French <gmludo@gmail.com>\n"
--"Language: \n"
-+"Language: fr\n"
- "MIME-Version: 1.0\n"
- "Content-Type: text/plain; charset=UTF-8\n"
- "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/he/LC_MESSAGES/django.po b/phonenumber_field/locale/he/LC_MESSAGES/django.po
-index 1160166..7e9ca18 100644
+index b15edca..c06732b 100644
 --- a/phonenumber_field/locale/he/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/he/LC_MESSAGES/django.po
 @@ -9,10 +9,10 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
 -"Language: \n"
@@ -121,15 +107,15 @@ index 1160166..7e9ca18 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/hy/LC_MESSAGES/django.po b/phonenumber_field/locale/hy/LC_MESSAGES/django.po
-index 95191bd..92d81fb 100644
+index 85e69dc..3307cb6 100644
 --- a/phonenumber_field/locale/hy/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/hy/LC_MESSAGES/django.po
 @@ -9,10 +9,10 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-06-14 11:06+0400\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-06-14 11:06+0400\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: Arnak Melikyan <arnak@melikyan.am>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
 -"Language: \n"
@@ -138,20 +124,20 @@ index 95191bd..92d81fb 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/nl/LC_MESSAGES/django.po b/phonenumber_field/locale/nl/LC_MESSAGES/django.po
-index 0ecb0b2..9dfc700 100644
+index 6ca6993..48dddb4 100644
 --- a/phonenumber_field/locale/nl/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/nl/LC_MESSAGES/django.po
 @@ -8,7 +8,7 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: Folkert de Vries <info@fdev.nl>\n"
  "Language: nl\n"
  "MIME-Version: 1.0\n"
 diff --git a/phonenumber_field/locale/pl/LC_MESSAGES/django.po b/phonenumber_field/locale/pl/LC_MESSAGES/django.po
-index 1ce15ab..da77ea2 100644
+index f00ab36..22e8d12 100644
 --- a/phonenumber_field/locale/pl/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/pl/LC_MESSAGES/django.po
 @@ -11,7 +11,7 @@ msgstr ""
@@ -164,7 +150,7 @@ index 1ce15ab..da77ea2 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/pt/LC_MESSAGES/django.po b/phonenumber_field/locale/pt/LC_MESSAGES/django.po
-index c3ba834..70d2f26 100644
+index ac046b1..0254df1 100644
 --- a/phonenumber_field/locale/pt/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/pt/LC_MESSAGES/django.po
 @@ -10,7 +10,7 @@ msgstr ""
@@ -177,7 +163,7 @@ index c3ba834..70d2f26 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po b/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po
-index 0d2db66..cb5e5fc 100644
+index c955a3d..d94e2a8 100644
 --- a/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po
 @@ -10,7 +10,7 @@ msgstr ""
@@ -190,7 +176,7 @@ index 0d2db66..cb5e5fc 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/ru/LC_MESSAGES/django.po b/phonenumber_field/locale/ru/LC_MESSAGES/django.po
-index 1f2e514..54f1153 100644
+index 97c744b..3785e6d 100644
 --- a/phonenumber_field/locale/ru/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/ru/LC_MESSAGES/django.po
 @@ -11,7 +11,7 @@ msgstr ""
@@ -203,15 +189,15 @@ index 1f2e514..54f1153 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/sk/LC_MESSAGES/django.po b/phonenumber_field/locale/sk/LC_MESSAGES/django.po
-index 77b8ad2..b68ffb1 100644
+index aab0463..da23b7f 100644
 --- a/phonenumber_field/locale/sk/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/sk/LC_MESSAGES/django.po
 @@ -8,10 +8,10 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2019-05-28 13:04-0700\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2019-05-28 13:04-0700\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  "Language-Team: LANGUAGE <LL@li.org>\n"
 -"Language: \n"
@@ -220,7 +206,7 @@ index 77b8ad2..b68ffb1 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po b/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po
-index d368e1d..f125739 100644
+index 1f4e451..4988815 100644
 --- a/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po
 @@ -11,7 +11,7 @@ msgstr ""
@@ -233,15 +219,15 @@ index d368e1d..f125739 100644
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 diff --git a/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po b/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po
-index 34694da..7f81294 100644
+index d1c2c0b..0862952 100644
 --- a/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po
 +++ b/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po
 @@ -9,10 +9,10 @@ msgstr ""
  "Project-Id-Version: PACKAGE VERSION\n"
  "Report-Msgid-Bugs-To: \n"
- "POT-Creation-Date: 2020-02-25 09:52+0800\n"
+ "POT-Creation-Date: 2024-07-16 11:14+0200\n"
 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-+"PO-Revision-Date: 2020-02-25 09:52+0800\n"
++"PO-Revision-Date: 2024-07-16 11:14+0200\n"
  "Last-Translator: Wentao Han <wentao.han@gmail.com>\n"
  "Language-Team: \n"
 -"Language: zh-Hans\n"
diff -pruN 8.0.0-1/debian/patches/0002-Include-data-files-like-translations.patch 8.1.0-1/debian/patches/0002-Include-data-files-like-translations.patch
--- 8.0.0-1/debian/patches/0002-Include-data-files-like-translations.patch	2024-07-18 09:13:41.000000000 +0000
+++ 8.1.0-1/debian/patches/0002-Include-data-files-like-translations.patch	2025-04-24 10:16:02.000000000 +0000
@@ -7,10 +7,10 @@ Subject: Include data files like transla
  1 file changed, 6 insertions(+)
 
 diff --git a/pyproject.toml b/pyproject.toml
-index ed5970e..7009f38 100644
+index 04c62b0..d10b500 100644
 --- a/pyproject.toml
 +++ b/pyproject.toml
-@@ -74,3 +74,9 @@ django_settings_module = "tests.settings"
+@@ -85,3 +85,9 @@ django_settings_module = "tests.settings"
  
  [tool.setuptools_scm]
  write_to = "phonenumber_field/version.py"
diff -pruN 8.0.0-1/docs/reference.rst 8.1.0-1/docs/reference.rst
--- 8.0.0-1/docs/reference.rst	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/docs/reference.rst	2025-04-10 08:12:54.000000000 +0000
@@ -117,10 +117,9 @@ Usage
 
 .. doctest:: formfield
 
-   >>> from django import forms
    >>> from phonenumber_field.formfields import PhoneNumberField
 
-   >>> class PhoneForm(forms.Form):
+   >>> class PhoneForm(django.forms.Form):
    ...     number = PhoneNumberField(region="CA")
    ...
 
@@ -147,12 +146,12 @@ Usage
     <label for="id_number">
      Number:
     </label>
-    <ul class="errorlist">
+    <ul class="errorlist" id="id_number_error">
      <li>
       Enter a valid phone number (e.g. (506) 234-5678) or a number with an international call prefix.
      </li>
     </ul>
-    <input aria-invalid="true" id="id_number" name="number" required="" type="tel" value="invalid"/>
+    <input aria-describedby="id_number_error" aria-invalid="true" id="id_number" name="number" required="" type="tel" value="invalid"/>
    </div>
 
 .. note:: Because the PhoneNumberField specifies a region, the example number
@@ -168,6 +167,14 @@ A :class:`~django.forms.MultiValueField`
 - a ``<select … >`` element to choose the region, and
 - an ``<input type="tel" … >`` to enter the phone number.
 
+To customize each field, subclass
+:class:`~phonenumber_field.formfields.SplitPhoneNumberField` and override:
+
+- :func:`~phonenumber_field.formfields.SplitPhoneNumberField.prefix_field`
+  for the phone number prefix field,
+- :func:`~phonenumber_field.formfields.SplitPhoneNumberField.number_field`
+  for the phone number field.
+
 This widget uses an example phone number from the selected region for the
 ``invalid`` key in :attr:`~django.forms.Field.error_messages`, when the region
 choice is valid.
@@ -180,17 +187,21 @@ To customize the dynamic message, use
 .. autoclass:: phonenumber_field.formfields.SplitPhoneNumberField
 
    .. automethod:: __init__
+   .. automethod:: prefix_field
+   .. automethod:: number_field
    .. automethod:: invalid_error_message
 
 Usage
 ~~~~~
 
-.. doctest:: SplitPhoneNumberField
+Simple
+......
+
+.. doctest:: SplitPhoneNumberField.basic
 
-   >>> from django import forms
    >>> from phonenumber_field.formfields import SplitPhoneNumberField
 
-   >>> class PhoneForm(forms.Form):
+   >>> class PhoneForm(django.forms.Form):
    ...     number = SplitPhoneNumberField()
    ...
 
@@ -220,16 +231,22 @@ Usage
     </fieldset>
    </div>
 
-   # Limiting country choices.
+Limiting country choices
+........................
+
+.. doctest:: SplitPhoneNumberField.country_choices
+
+   >>> from phonenumber_field.formfields import SplitPhoneNumberField
+
    >>> class DemoSplitPhoneNumberField(SplitPhoneNumberField):
    ...     def prefix_field(self):
-   ...         return forms.ChoiceField(choices=[
+   ...         return django.forms.ChoiceField(choices=[
    ...             ("", "---------"),
    ...             ("CA", "Canada"),
    ...             ("FR", "France"),
    ...         ])
    ...
-   >>> class LimitedCountryPhoneForm(forms.Form):
+   >>> class LimitedCountryPhoneForm(django.forms.Form):
    ...     number = DemoSplitPhoneNumberField()
    ...
    >>> form = LimitedCountryPhoneForm()
@@ -254,8 +271,23 @@ Usage
     </fieldset>
    </div>
 
-   # Pre-selecting a country.
-   >>> class FrenchPhoneForm(forms.Form):
+Pre-selecting a country
+.......................
+
+.. doctest:: SplitPhoneNumberField.preselecting_country
+
+   >>> from phonenumber_field.formfields import SplitPhoneNumberField
+
+   >>> class DemoSplitPhoneNumberField(SplitPhoneNumberField):
+   ...     def prefix_field(self):
+   ...         return django.forms.ChoiceField(choices=[
+   ...             ("", "---------"),
+   ...             ("CA", "Canada"),
+   ...             ("FR", "France"),
+   ...         ])
+   ...
+
+   >>> class FrenchPhoneForm(django.forms.Form):
    ...     number = DemoSplitPhoneNumberField(region="FR")
    ...
 
@@ -281,6 +313,53 @@ Usage
     </fieldset>
    </div>
 
+Customizing widget attrs
+........................
+
+.. doctest:: SplitPhoneNumberField.preselecting_country
+
+   >>> from phonenumber_field.formfields import SplitPhoneNumberField
+
+   >>> class DemoSplitPhoneNumberField(SplitPhoneNumberField):
+   ...     def prefix_field(self):
+   ...         return django.forms.ChoiceField(choices=[
+   ...             ("", "---------"),
+   ...             ("CA", "Canada"),
+   ...             ("FR", "France"),
+   ...         ])
+   ...
+   ...     def number_field(self):
+   ...         number_field = super().number_field()
+   ...         number_field.widget.attrs["class"] = "form-control"
+   ...         return number_field
+   ...
+
+   >>> class BootstrapPhoneForm(django.forms.Form):
+   ...     number = DemoSplitPhoneNumberField()
+   ...
+
+   >>> form = BootstrapPhoneForm()
+   >>> print_html(form.as_div())
+   <div>
+    <fieldset>
+     <legend>
+      Number:
+     </legend>
+     <select id="id_number_0" name="number_0" required="">
+      <option selected="" value="">
+       ---------
+      </option>
+      <option value="CA">
+       Canada
+      </option>
+      <option value="FR">
+       France
+      </option>
+     </select>
+     <input class="form-control" id="id_number_1" name="number_1" required="" type="tel"/>
+    </fieldset>
+   </div>
+
 Widgets
 -------
 
@@ -307,10 +386,9 @@ Usage
 
 .. doctest:: fallbackwidget
 
-   >>> from django import forms
    >>> from phonenumber_field.formfields import PhoneNumberField
 
-   >>> class CanadianPhoneForm(forms.Form):
+   >>> class CanadianPhoneForm(django.forms.Form):
    ...     # RegionalPhoneNumberWidget is the default widget.
    ...     number = PhoneNumberField(region="CA")
    ...
diff -pruN 8.0.0-1/phonenumber_field/formfields.py 8.1.0-1/phonenumber_field/formfields.py
--- 8.0.0-1/phonenumber_field/formfields.py	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/formfields.py	2025-04-10 08:12:54.000000000 +0000
@@ -5,8 +5,8 @@ from django.core.exceptions import Impro
 from django.forms.fields import CharField, ChoiceField, MultiValueField
 from django.utils import translation
 from django.utils.text import format_lazy
-from django.utils.translation import gettext_lazy as _
-from phonenumbers import COUNTRY_CODE_TO_REGION_CODE
+from django.utils.translation import pgettext, pgettext_lazy
+from phonenumbers import COUNTRY_CODE_TO_REGION_CODE, COUNTRY_CODES_FOR_NON_GEO_REGIONS
 
 from phonenumber_field import widgets
 from phonenumber_field.phonenumber import to_python, validate_region
@@ -17,10 +17,13 @@ try:
 except ModuleNotFoundError:
     babel = None  # type: ignore
 
+GEO_COUNTRY_CODE_TO_REGION_CODE = COUNTRY_CODE_TO_REGION_CODE.copy()
+for country_code in COUNTRY_CODES_FOR_NON_GEO_REGIONS:
+    del GEO_COUNTRY_CODE_TO_REGION_CODE[country_code]
 # ISO 3166-1 alpha-2 to national prefix
 REGION_CODE_TO_COUNTRY_CODE = {
     region_code: country_code
-    for country_code, region_codes in COUNTRY_CODE_TO_REGION_CODE.items()
+    for country_code, region_codes in GEO_COUNTRY_CODE_TO_REGION_CODE.items()
     for region_code in region_codes
 }
 
@@ -52,15 +55,17 @@ class PhoneNumberField(CharField):
             if self.region:
                 number = phonenumbers.example_number(self.region)
                 example_number = to_python(number).as_national
-                # Translators: {example_number} is a national phone number.
-                error_message = _(
+                error_message = pgettext_lazy(
+                    "{example_number} is a national phone number.",
                     "Enter a valid phone number (e.g. {example_number}) "
-                    "or a number with an international call prefix."
+                    "or a number with an international call prefix.",
                 )
             else:
                 example_number = "+12125552368"  # Ghostbusters
-                # Translators: {example_number} is an international phone number.
-                error_message = _("Enter a valid phone number (e.g. {example_number}).")
+                error_message = pgettext_lazy(
+                    "{example_number} is an international phone number.",
+                    "Enter a valid phone number (e.g. {example_number}).",
+                )
             self.error_messages["invalid"] = format_lazy(
                 error_message, example_number=example_number
             )
@@ -131,13 +136,19 @@ class SplitPhoneNumberField(MultiValueFi
 
     def prefix_field(self):
         """
-        Customize the phone number prefix field.
+        Returns the default :class:`~django.forms.Field` for the phone
+        number prefix field.
+
+        Use this hook to set widget attributes or update the field definition.
         """
         return PrefixChoiceField()
 
     def number_field(self):
         """
-        Customize the phone number input field.
+        Returns the default :class:`~django.forms.Field` for the phone
+        number field.
+
+        Use this hook to set widget attributes or update the field definition.
         """
         number_field = CharField()
         number_field.widget.input_type = "tel"
@@ -150,8 +161,10 @@ class SplitPhoneNumberField(MultiValueFi
         Include the example number in the message with the ``{example_number}``
         placeholder.
         """
-        # Translators: {example_number} is a national phone number.
-        return _("Enter a valid phone number (e.g. {example_number}).")
+        return pgettext(
+            "{example_number} is a national phone number.",
+            "Enter a valid phone number (e.g. {example_number}).",
+        )
 
     def compress(self, data_list):
         if not data_list:
diff -pruN 8.0.0-1/phonenumber_field/locale/ar/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/ar/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/ar/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/ar/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-23 15:35+0100\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2020-03-23 15:41+0100\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -20,27 +20,39 @@ msgstr ""
 "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 "X-Generator: Gtranslator 2.91.7\n"
 
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr "أدخل رقم هاتف صالح (مثال {example_number} ) أو رقم له بادئة دولية "
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "أدخل رقم هاتف صالح (مثال {example_number} )."
 
-#: phonenumber_field/modelfields.py:53
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "أدخل رقم هاتف صالح (مثال {example_number} )."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "رقم الهاتف"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "أدخل رقم هاتف صالح"
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "رقم الهاتف الذي تم إدخاله غير صالح."
diff -pruN 8.0.0-1/phonenumber_field/locale/az/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/az/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/az/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/az/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Emin Mastizada <emin@linux.com>\n"
 "Language-Team: Azerbaijani <info@mozillaz.org>\n"
@@ -17,28 +17,37 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "Düzgün telefon nömrəsi daxil edin."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Düzgün telefon nömrəsi daxil edin."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Düzgün telefon nömrəsi daxil edin."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefon nömrəsi"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Düzgün telefon nömrəsi daxil edin."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Daxil etdiyiniz telefon nömrəsi səhvdir."
diff -pruN 8.0.0-1/phonenumber_field/locale/bg/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/bg/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/bg/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/bg/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-12 13:04+0200\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2020-11-12 13:04+0200\n"
 "Last-Translator: ELENA ROGLEVA <elena.rogleva@gmail.com>\n"
 "Language-Team: \n"
@@ -17,28 +17,41 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr ""
-"Моля, въведете валиден телефонен номер (например {example_number}) или "
-"номер с международен телефонен код."
+"Моля, въведете валиден телефонен номер (например {example_number}) или номер "
+"с международен телефонен код."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Моля, въведете валиден телефонен номер (например {example_number})."
 
-#: modelfields.py:51
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Моля, въведете валиден телефонен номер (например {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Телефонен номер"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Моля, въведете валиден телефонен номер."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Въведеният телефонен номер е невалиден."
diff -pruN 8.0.0-1/phonenumber_field/locale/bn/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/bn/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/bn/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/bn/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Tanvir Hasan <tanvir002700@gmail.com>\n"
 "Language-Team: \n"
@@ -17,28 +17,37 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "একটি বৈধ ফোন নম্বর লিখুন।"
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "একটি বৈধ ফোন নম্বর লিখুন।"
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "একটি বৈধ ফোন নম্বর লিখুন।"
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "ফোন নাম্বার"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "একটি বৈধ ফোন নম্বর লিখুন।"
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "প্রদত্ত ফোন নাম্বারটি বৈধ নয়।"
diff -pruN 8.0.0-1/phonenumber_field/locale/cs/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/cs/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/cs/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/cs/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -1,7 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: django-phonenumber-field 5.2.0\n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2021-07-28 21:06+0200\n"
 "Last-Translator: melanger\n"
 "Language-Team: Melanger.cz\n"
@@ -11,16 +12,30 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
-#: formfields.py:28
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr ""
-"Vložte platné telefonní číslo (např. {example_number}) nebo číslo s mezinárodní předvolbou."
+"Vložte platné telefonní číslo (např. {example_number}) nebo číslo s "
+"mezinárodní předvolbou."
 
-#: formfields.py:34
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Vložte platné telefonní číslo (např. {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Vložte platné telefonní číslo (např. {example_number})."
 
@@ -28,10 +43,10 @@ msgstr "Vložte platné telefonní čís
 msgid "Phone number"
 msgstr "Telefonní číslo"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Vložte platné telefonní číslo."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Zadané telefonní číslo není platné."
diff -pruN 8.0.0-1/phonenumber_field/locale/da/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/da/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/da/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/da/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2016-03-14 12:50+0100\n"
 "Last-Translator: René Tronsgaard <tronsgaard@gmail.com>\n"
 "Language-Team: \n"
@@ -17,28 +17,37 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.5.4\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "Indtast et gyldigt telefonnummer."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Indtast et gyldigt telefonnummer."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Indtast et gyldigt telefonnummer."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefonnummer"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Indtast et gyldigt telefonnummer."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Det indtastede telefonnummer er ugyldigt."
diff -pruN 8.0.0-1/phonenumber_field/locale/de/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/de/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/de/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/de/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,28 +17,41 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr ""
-"Bitte eine gültige Telefonnummer (z. B. {example_number}) oder eine "
-"gültige Nummer mit internationaler Vorwahl eingeben."
+"Bitte eine gültige Telefonnummer (z. B. {example_number}) oder eine gültige "
+"Nummer mit internationaler Vorwahl eingeben."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Bitte eine gültige Telefonnummer (z. B. {example_number}) eingeben."
 
-#: modelfields.py:51
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Bitte eine gültige Telefonnummer (z. B. {example_number}) eingeben."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefonnummer"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Bitte eine gültige Telefonnummer eingeben."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Die eingegebene Telefonnummer ist ungültig."
diff -pruN 8.0.0-1/phonenumber_field/locale/eo/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/eo/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/eo/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/eo/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2021-03-11 16:09+0000\n"
 "Last-Translator: Meiyer <interDist@users.noreply.github.com>\n"
 "Language-Team: Esperanto\n"
@@ -12,8 +12,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -21,9 +25,17 @@ msgstr ""
 "Bv. enigu ĝustan lokan telefon-numeron (ekz. {example_number}) aŭ numeron "
 "kun internacia voko-prefikso."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Bv. enigu ĝustan telefon-numeron (ekz. {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Bv. enigu ĝustan telefon-numeron (ekz. {example_number})."
 
@@ -31,10 +43,10 @@ msgstr "Bv. enigu ĝustan telefon-numero
 msgid "Phone number"
 msgstr "Telefona numero"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Bv. enigu ĝustan telefon-numeron."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "La provizita numero ne estas en akceptebla formato."
diff -pruN 8.0.0-1/phonenumber_field/locale/es/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/es/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/es/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/es/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2020-09-30 18:32+0200\n"
 "Last-Translator: Joao Lopez <jslopez@csrg.inf.utfsm.cl>\n"
 "Language-Team: \n"
@@ -17,8 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -26,20 +30,28 @@ msgstr ""
 "Ingrese un número de teléfono válido  (ej.: {example_number}) o un número "
 "con un prefijo de llamado internacional."
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Ingrese un número de teléfono válido  (ej.: {example_number})."
 
-#: phonenumber_field/modelfields.py:53
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Ingrese un número de teléfono válido  (ej.: {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Número de teléfono"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Ingrese un número de teléfono válido."
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "El número de teléfono ingresado no es válido."
diff -pruN 8.0.0-1/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/es_AR/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-09-30 10:42-0500\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -17,8 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -26,20 +30,28 @@ msgstr ""
 "Ingresá un número de teléfono válido (ej.: {example_number}) o un número con "
 "un prefijo internacional."
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Ingresá un número de teléfono válido (ej.: {example_number})."
 
-#: phonenumber_field/modelfields.py:53
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Ingresá un número de teléfono válido (ej.: {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Número de teléfono"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Ingresá un número de teléfono válido."
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "El número de teléfono ingresado es inválido."
diff -pruN 8.0.0-1/phonenumber_field/locale/fa/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/fa/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/fa/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/fa/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-10 14:27+0330\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2021-12-10 14:27+0330\n"
 "Last-Translator: Mahmood Heidari mahmoodh1378@gmail.com\n"
 "Language-Team: \n"
@@ -16,16 +16,30 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: formfields.py:29
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "یک شماره تماس معتبر (مانند {example_number}) یا یک شماره با پیشوند کشور مورد نظر وارد نمایید."
+msgstr ""
+"یک شماره تماس معتبر (مانند {example_number}) یا یک شماره با پیشوند کشور مورد "
+"نظر وارد نمایید."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "یک شماره تماس معتبر وارد نمایید (مانند {example_number})."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:35
-#, python-brace-format
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "یک شماره تماس معتبر وارد نمایید (مانند {example_number})."
 
@@ -33,10 +47,10 @@ msgstr "یک شماره تماس معت
 msgid "Phone number"
 msgstr "شماره تماس"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "یک شماره تماس معتبر وارد نمایید."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "شماره تماس وارد شده معتبر نیست."
diff -pruN 8.0.0-1/phonenumber_field/locale/fi/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/fi/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/fi/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/fi/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2015-10-26 10:25+0200\n"
 "Last-Translator: Ville Skyttä <ville.skytta@iki.fi>\n"
 "Language-Team: \n"
@@ -17,28 +17,37 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.8.5\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "Syötä oikea puhelinnumero."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Syötä oikea puhelinnumero."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Syötä oikea puhelinnumero."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Puhelinnumero"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Syötä oikea puhelinnumero."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Syötetty puhelinnumero on virheellinen."
diff -pruN 8.0.0-1/phonenumber_field/locale/fr/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/fr/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/fr/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/fr/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,18 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
-"PO-Revision-Date: 2011-10-19 14:10+0200\n"
-"Last-Translator: Stéphane Raimbault <stephane.raimbault@gmail.com>\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
+"PO-Revision-Date: 2024-07-16 11:23+0200\n"
+"Last-Translator: François Freitag <mail@franek.fr>\n"
 "Language-Team: French <gmludo@gmail.com>\n"
-"Language: \n"
+"Language: fr_FR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4.2\n"
 
-#: formfields.py:27
+#: formfields.py:57
 #, python-brace-format
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -26,20 +28,26 @@ msgstr ""
 "Saisissez un numéro de téléphone valide, par exemple {example_number}, ou un "
 "numéro avec un indicatif international."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:64
 #, python-brace-format
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Saisissez un numéro de téléphone valide, par exemple {example_number}."
 
-#: modelfields.py:51
+#: formfields.py:157
+#, python-brace-format
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Saisissez un numéro de téléphone valide, par exemple {example_number}."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Numéro de téléphone"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Saisissez un numéro de téléphone valide."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Le numéro saisi n'est pas valide."
diff -pruN 8.0.0-1/phonenumber_field/locale/he/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/he/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/he/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/he/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,27 +18,40 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "הזן מספר טלפון חוקי (לדוגמה {example_number}) או מספר עם קידומת בינלאומית."
+msgstr ""
+"הזן מספר טלפון חוקי (לדוגמה {example_number}) או מספר עם קידומת בינלאומית."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "הזן מספר טלפון חוקי (לדוגמה {example_number})."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "הזן מספר טלפון חוקי (לדוגמה {example_number})."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "מספר טלפון"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "הזן מספר טלפון חוקי"
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "מספר הטלפון שהוזן אינו חוקי"
diff -pruN 8.0.0-1/phonenumber_field/locale/hy/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/hy/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/hy/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/hy/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-06-14 11:06+0400\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Arnak Melikyan <arnak@melikyan.am>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,28 +17,42 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "Մուտքագրեք վավեր հեռախոսահամար (օրինակ, {example_number}) կամ "
-"միջազգային ձեւաչափով։"
+msgstr ""
+"Մուտքագրեք վավեր հեռախոսահամար (օրինակ, {example_number}) կամ միջազգային "
+"ձեւաչափով։"
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Մուտքագրեք վավեր հեռախոսահամար (օրինակ, {example_number})։"
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Մուտքագրեք վավեր հեռախոսահամար (օրինակ, {example_number})։"
 
-#: phonenumber_field/modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Հեռախոսահամար"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Մուտքագրեք վավեր հեռախոսահամար"
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Մուտքագրված հեռախոսահամարը վավեր չէ։"
diff -pruN 8.0.0-1/phonenumber_field/locale/id/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/id/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/id/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/id/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-02-05 21:42+0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2021-02-05 21:42+0700\n"
 "Last-Translator: Arsyi Syarief Aziz <arsyiaziz@gmail.com>\n"
 "Language-Team: Indonesian <LL@li.org>\n"
@@ -16,28 +16,41 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "Masukkan nomor telepon yang benar (misalkan {example_number}) "
-"atau nomor yang dilengkapi dengan prefiks kode panggilan internasional."
+msgstr ""
+"Masukkan nomor telepon yang benar (misalkan {example_number}) atau nomor "
+"yang dilengkapi dengan prefiks kode panggilan internasional."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Masukkan nomor telepon yang benar (misalkan {example_number})."
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Masukkan nomor telepon yang benar (misalkan {example_number})."
 
-#: phonenumber_field/modelfields.py:53
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Nomor telepon"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Masukkan nomor telepon yang benar."
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Nomor telepon yang dimasukkan tidak benar."
diff -pruN 8.0.0-1/phonenumber_field/locale/it/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/it/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/it/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/it/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -1,47 +1,59 @@
-# Copyright (C) 2013-2018
-# This file is distributed under the same license as the PACKAGE package.
-#
-# Francesco Facconi <francesco@immediatic.it>, 2013-2017.
-# Paolo Melchiorre <paolo@melchiorre.org>, 2018.
-# Ruggero Fabbiano <ruggero_fabbiano@outlook.com>, 2023.
-msgid ""
-msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-12-28 15:43+0100\n"
-"PO-Revision-Date: 2018-02-28 20:23+0100\n"
-"Last-Translator: Paolo Melchiorre <paolo@melchiorre.org>\n"
-"Language-Team: Italian <paolo@melchiorre.org>\n"
-"Language: it\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.0.4\n"
-
-#: .\formfields.py:43
-#, python-brace-format
-msgid ""
-"Enter a valid phone number (e.g. {example_number}) or a number with an "
-"international call prefix."
-msgstr ""
-"Inserisci un numero di telefono valido (esempio: {example_number}) o un "
-"numero con un prefisso internazionale."
-
-#. Translators: {example_number} is an international phone number.
-#: .\formfields.py:49
-#, python-brace-format
-msgid "Enter a valid phone number (e.g. {example_number})."
-msgstr "Inserisci un numero di telefono valido (esempio: {example_number})."
-
-#: .\modelfields.py:53
-msgid "Phone number"
-msgstr "Numero di telefono"
-
-#: .\serializerfields.py:10
-msgid "Enter a valid phone number."
-msgstr "Inserisci un numero di telefono valido."
-
-#: .\validators.py:11
-msgid "The phone number entered is not valid."
-msgstr "Il numero di telefono inserito non è valido."
+# Copyright (C) 2013-2018
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Francesco Facconi <francesco@immediatic.it>, 2013-2017.
+# Paolo Melchiorre <paolo@melchiorre.org>, 2018.
+# Ruggero Fabbiano <ruggero_fabbiano@outlook.com>, 2023.
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
+"PO-Revision-Date: 2018-02-28 20:23+0100\n"
+"Last-Translator: Paolo Melchiorre <paolo@melchiorre.org>\n"
+"Language-Team: Italian <paolo@melchiorre.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.0.4\n"
+
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
+msgid ""
+"Enter a valid phone number (e.g. {example_number}) or a number with an "
+"international call prefix."
+msgstr ""
+"Inserisci un numero di telefono valido (esempio: {example_number}) o un "
+"numero con un prefisso internazionale."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Inserisci un numero di telefono valido (esempio: {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Inserisci un numero di telefono valido (esempio: {example_number})."
+
+#: modelfields.py:53
+msgid "Phone number"
+msgstr "Numero di telefono"
+
+#: serializerfields.py:10
+msgid "Enter a valid phone number."
+msgstr "Inserisci un numero di telefono valido."
+
+#: validators.py:12 validators.py:23
+msgid "The phone number entered is not valid."
+msgstr "Il numero di telefono inserito non è valido."
diff -pruN 8.0.0-1/phonenumber_field/locale/ko/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/ko/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/ko/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/ko/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2017-04-15 16:56+0100\n"
 "Last-Translator: Jiyoon Ha <cryptography@konkuk.ac.kr>\n"
 "Language-Team: \n"
@@ -16,28 +16,37 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "올바른 전화번호를 입력해주세요."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "올바른 전화번호를 입력해주세요."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "올바른 전화번호를 입력해주세요."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "전화번호"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "올바른 전화번호를 입력해주세요."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "입력하신 전화번호가 올바른 형식이 아닙니다."
diff -pruN 8.0.0-1/phonenumber_field/locale/lt/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/lt/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/lt/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/lt/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-10-15 21:40+0300\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2020-10-15 21:22+0300\n"
 "Last-Translator: KiraLT <info@kiralt.dev>\n"
 "Language-Team: Lithuanian (http://www.transifex.com/django/django)\n"
@@ -18,8 +18,12 @@ msgstr ""
 "11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? "
 "1 : n % 1 != 0 ? 2: 3);\n"
 
-#: phonenumber_field/formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -27,20 +31,28 @@ msgstr ""
 "Įveskite teisingą telefono numerį (pvz. {example_number}) arba numerį su "
 "tarptautinio skambučio kodu."
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Įveskite teisingą telefono numerį (pvz. {example_number})."
 
-#: phonenumber_field/modelfields.py:53
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Įveskite teisingą telefono numerį (pvz. {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefono numeris"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Įveskite teisingą telefono numerį."
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Įvestas telefono numeris nėra teisingas."
diff -pruN 8.0.0-1/phonenumber_field/locale/nb/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/nb/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/nb/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/nb/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-03-22 22:50+0100\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2016-10-21 15:04+0200\n"
 "Last-Translator: Kristian Klette <klette@klette.us>\n"
 "Language-Team: \n"
@@ -18,8 +18,12 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 1.8.9\n"
 
-#: formfields.py:43
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -27,9 +31,17 @@ msgstr ""
 "Tast inn et gyldig telefonnummer (f.eks. {example_number}) eller et nummer "
 "med internasjonal landskode."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:49
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Tast inn et gyldig telefonnummer (f.eks. {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Tast inn et gyldig telefonnummer (f.eks. {example_number})."
 
@@ -41,6 +53,6 @@ msgstr "Telefonnummer"
 msgid "Enter a valid phone number."
 msgstr "Tast inn et gyldig telefonnummer."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Telefonnummeret er ugyldig."
diff -pruN 8.0.0-1/phonenumber_field/locale/nl/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/nl/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/nl/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/nl/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Folkert de Vries <info@fdev.nl>\n"
 "Language: nl\n"
@@ -16,28 +16,41 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "Vul een geldig telefoonnummer in (bijvoorbeeld: {example_number}) of een "
+msgstr ""
+"Vul een geldig telefoonnummer in (bijvoorbeeld: {example_number}) of een "
 "telefoonnummer voorafgegaan door een landcode (bijvoorbeeld: +31)."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Vul een geldig telefoonnummer in (bijvoorbeeld: {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Vul een geldig telefoonnummer in (bijvoorbeeld: {example_number})."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefoonnummer"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Vul een geldig telefoonnummer in."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Het ingevulde telefoonnummer is niet geldig."
diff -pruN 8.0.0-1/phonenumber_field/locale/pl/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/pl/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/pl/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/pl/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2022-03-22 08:45+0100\n"
 "Last-Translator: Andrzej Mateja <mateja.and@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,8 +18,12 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: phonenumber_field/formfields.py:29
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -27,20 +31,28 @@ msgstr ""
 "Wprowadź poprawny numer telefonu (np. {example_number}) lub numer "
 "poprzedzony międzynarodowym numerem kierunkowym."
 
-#. Translators: {example_number} is an international phone number.
-#: phonenumber_field/formfields.py:35
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Wprowadź poprawny numer telefonu (np. {example_number})."
 
-#: phonenumber_field/modelfields.py:53
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Wprowadź poprawny numer telefonu (np. {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Numer telefonu"
 
-#: phonenumber_field/serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Wprowadź poprawny numer telefonu."
 
-#: phonenumber_field/validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Wprowadzony numer telefonu jest nieprawidłowy."
diff -pruN 8.0.0-1/phonenumber_field/locale/pt/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/pt/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/pt/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/pt/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2013-02-26 14:10+0200\n"
 "Last-Translator: Luis Rodrigues <lfrodrigues@gmail.com>\n"
 "Language-Team: Portuguese <lfrodrigues@gmail.com>\n"
@@ -17,29 +17,41 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 "X-Generator: Lokalize 1.2\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr ""
-"Introduza um número de telefone válido (ex. {example_number}) ou "
-"um número com prefixo internacional"
+"Introduza um número de telefone válido (ex. {example_number}) ou um número "
+"com prefixo internacional"
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Introduza um número de telefone válido (ex. {example_number})."
 
-#: modelfields.py:51
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Introduza um número de telefone válido (ex. {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Número de telefone"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Introduza um número de telefone válido."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Este número de telefone não é válido."
diff -pruN 8.0.0-1/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/pt_BR/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2013-02-26 14:10-0300\n"
 "Last-Translator: Fábio Thomaz <fabio_thz@yahoo.com.br>\n"
 "Language-Team: Portuguese - Brazil <fabio_thz@yahoo.com.br>\n"
@@ -17,8 +17,12 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 "X-Generator: Lokalize 1.2\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -26,21 +30,28 @@ msgstr ""
 "Forneça um número de telefone válido, por exemplo {example_number}, ou um "
 "número que tenha um prefixo internacional."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Informe um número de telefone válido."
+
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Informe um número de telefone válido."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Número de telefone"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Informe um número de telefone válido."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Este número de telefone não é válido."
diff -pruN 8.0.0-1/phonenumber_field/locale/ro/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/ro/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/ro/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/ro/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2018-10-19 14:07+0300\n"
 "Last-Translator: Cristi Vîjdea <cristi@cvjd.me>\n"
 "Language-Team: \n"
@@ -17,28 +17,37 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
 "2:1));\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "Introduceți un număr de telefon valid."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Introduceți un număr de telefon valid."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Introduceți un număr de telefon valid."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Număr de telefon"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Introduceți un număr de telefon valid."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Numărul de telefon introdus nu este valid."
diff -pruN 8.0.0-1/phonenumber_field/locale/ru/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/ru/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/ru/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/ru/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-05-15 12:56+0000\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2021-05-15 19:57+0700\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,11 +15,15 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -27,9 +31,17 @@ msgstr ""
 "Введите корректный номер телефона (например, {example_number}) или номер с "
 "префиксом международной связи."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Введите корректный номер телефона (например, {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Введите корректный номер телефона (например, {example_number})."
 
@@ -37,10 +49,10 @@ msgstr "Введите корректн
 msgid "Phone number"
 msgstr "Номер телефона"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Введите корректный номер телефона."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Введен некорректный номер телефона."
diff -pruN 8.0.0-1/phonenumber_field/locale/sk/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/sk/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/sk/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/sk/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,28 +17,37 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr ""
+msgstr "Vložte platné telefónne číslo."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Vložte platné telefónne číslo."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Vložte platné telefónne číslo."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefónne číslo"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Vložte platné telefónne číslo."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Zadané telefónne číslo je neplatné."
diff -pruN 8.0.0-1/phonenumber_field/locale/sv/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/sv/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/sv/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/sv/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2017-12-05 22:18+0100\n"
 "Last-Translator: Jonas Lidén <jonas@lideen.se>\n"
 "Language-Team: Swedish\n"
@@ -18,29 +18,41 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 1.8.7.1\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
-msgstr "Ange ett giltigt telefonnummer (t ex {example_number}) eller ett nummer med "
+msgstr ""
+"Ange ett giltigt telefonnummer (t ex {example_number}) eller ett nummer med "
 "internationellt format."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
-#| msgid "Enter a valid phone number."
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Ange ett giltigt telefonnummer (t ex {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Ange ett giltigt telefonnummer (t ex {example_number})."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Telefonnummer"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Ange ett giltigt telefonnummer."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Det angivna telefonnumret är inte giltigt."
diff -pruN 8.0.0-1/phonenumber_field/locale/tr/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/tr/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/tr/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/tr/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2022-01-15 14:51+0300\n"
 "Last-Translator: Şuayip Üzülmez <suayip.541@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,8 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: formfields.py:29
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -26,9 +30,17 @@ msgstr ""
 "Geçerli bir telefon numarası girin (ör. {example_number}) ya da uluslararası "
 "arama öneki olan bir numara girin."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:35
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Geçerli bir telefon numarası giriniz (ör. {example_number})."
+
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Geçerli bir telefon numarası giriniz (ör. {example_number})."
 
@@ -36,10 +48,10 @@ msgstr "Geçerli bir telefon numarası g
 msgid "Phone number"
 msgstr "Telefon numarası"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Geçerli bir telefon numarası giriniz."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Girmiş olduğunuz telefon numarası geçersiz."
diff -pruN 8.0.0-1/phonenumber_field/locale/uk/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/uk/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/uk/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/uk/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2018-06-06 00:07+0300\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -15,12 +15,16 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Poedit 2.0.8\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
@@ -28,20 +32,28 @@ msgstr ""
 "Введіть коректний номер телефону (наприклад, {example_number}) або номер з "
 "префіксом міжнародного зв'язку."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
-#, python-brace-format
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is an international phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Введіть коректний номер телефону (наприклад, {example_number})."
 
-#: modelfields.py:51
+#: formfields.py:157
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number (e.g. {example_number})."
+msgctxt "{example_number} is a national phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Введіть коректний номер телефону (наприклад, {example_number})."
+
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Номер телефону"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Введіть коректний номер телефону."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Введено некоректний номер телефону."
diff -pruN 8.0.0-1/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/uk_UA/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-28 13:04-0700\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: 2018-06-06 00:07+0300\n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -15,34 +15,45 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Generator: Poedit 2.0.8\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr ""
-"Введіть коректний номер телефону (e.g. {example_number})  або номер з" 
-"міжнародним префіксом."
+"Введіть коректний номер телефону (e.g. {example_number})  або номер "
+"зміжнародним префіксом."
+
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "Введіть коректний номер телефону."
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "Введіть коректний номер телефону."
 
-#: modelfields.py:51
+#: modelfields.py:53
 msgid "Phone number"
 msgstr "Номер телефону"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "Введіть коректний номер телефону."
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "Введено некоректний номер телефону."
diff -pruN 8.0.0-1/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po 8.1.0-1/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po
--- 8.0.0-1/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/locale/zh_Hans/LC_MESSAGES/django.po	2025-04-10 08:12:54.000000000 +0000
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-02-25 09:52+0800\n"
+"POT-Creation-Date: 2024-07-16 11:14+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Wentao Han <wentao.han@gmail.com>\n"
 "Language-Team: \n"
@@ -18,17 +18,28 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: formfields.py:27
-#, python-brace-format
+#: formfields.py:57
+#, fuzzy, python-brace-format
+#| msgid ""
+#| "Enter a valid phone number (e.g. {example_number}) or a number with an "
+#| "international call prefix."
+msgctxt "{example_number} is a national phone number."
 msgid ""
 "Enter a valid phone number (e.g. {example_number}) or a number with an "
 "international call prefix."
 msgstr "输入一个合法的电话号码（例如，{example_number}）或带国际冠码的号码。"
 
-#. Translators: {example_number} is an international phone number.
-#: formfields.py:33
+#: formfields.py:64
+#, fuzzy, python-brace-format
+#| msgid "Enter a valid phone number."
+msgctxt "{example_number} is an international phone number."
+msgid "Enter a valid phone number (e.g. {example_number})."
+msgstr "输入一个合法的电话号码（例如，{example_number}）。"
+
+#: formfields.py:157
 #, fuzzy, python-brace-format
 #| msgid "Enter a valid phone number."
+msgctxt "{example_number} is a national phone number."
 msgid "Enter a valid phone number (e.g. {example_number})."
 msgstr "输入一个合法的电话号码（例如，{example_number}）。"
 
@@ -36,10 +47,10 @@ msgstr "输入一个合法的电话号
 msgid "Phone number"
 msgstr "电话号码"
 
-#: serializerfields.py:9
+#: serializerfields.py:10
 msgid "Enter a valid phone number."
 msgstr "输入一个合法的电话号码。"
 
-#: validators.py:11
+#: validators.py:12 validators.py:23
 msgid "The phone number entered is not valid."
 msgstr "输入的电话号码不合法。"
diff -pruN 8.0.0-1/phonenumber_field/modelfields.py 8.1.0-1/phonenumber_field/modelfields.py
--- 8.0.0-1/phonenumber_field/modelfields.py	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/modelfields.py	2025-04-10 08:12:54.000000000 +0000
@@ -1,6 +1,9 @@
+from typing import Optional
+
 from django.conf import settings
 from django.core import checks
 from django.db import models
+from django.forms import Field
 from django.utils.encoding import force_str
 from django.utils.translation import gettext_lazy as _
 
@@ -114,11 +117,19 @@ class PhoneNumberField(models.CharField)
         kwargs["region"] = self._region
         return name, path, args, kwargs
 
-    def formfield(self, **kwargs):
+    def formfield(
+        self,
+        form_class=None,
+        choices_form_class=None,
+        **kwargs,
+    ) -> Optional[Field]:
         defaults = {
-            "form_class": formfields.PhoneNumberField,
+            "form_class": (
+                formfields.PhoneNumberField if form_class is None else form_class
+            ),
             "region": self.region,
             "error_messages": self.error_messages,
+            "choices_form_class": choices_form_class,
         }
         defaults.update(kwargs)
         return super().formfield(**defaults)
diff -pruN 8.0.0-1/phonenumber_field/phonenumber.py 8.1.0-1/phonenumber_field/phonenumber.py
--- 8.0.0-1/phonenumber_field/phonenumber.py	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/phonenumber_field/phonenumber.py	2025-04-10 08:12:54.000000000 +0000
@@ -125,7 +125,7 @@ class PhoneNumber(phonenumbers.PhoneNumb
         elif not isinstance(other, type(self)):
             raise TypeError(
                 "'<' not supported between instances of "
-                "'%s' and '%s'" % (type(self).__name__, type(other).__name__)
+                f"'{type(self).__name__}' and '{type(other).__name__}'"
             )
 
         invalid = None
@@ -134,7 +134,7 @@ class PhoneNumber(phonenumbers.PhoneNumb
         elif not other.is_valid():
             invalid = other
         if invalid is not None:
-            raise ValueError("Invalid phone number: %r" % invalid)
+            raise ValueError(f"Invalid phone number: {invalid!r}")
 
         format_string = getattr(settings, "PHONENUMBER_DB_FORMAT", "E164")
         fmt = self.format_map[format_string]
@@ -159,13 +159,13 @@ def to_python(value, region=None):
         phone_number = PhoneNumber()
         phone_number.merge_from(value)
     else:
-        raise TypeError("Can't convert %s to PhoneNumber." % type(value).__name__)
+        raise TypeError(f"Can't convert {type(value).__name__} to PhoneNumber.")
     return phone_number
 
 
 def validate_region(region):
     if region is not None and region not in phonenumbers.SUPPORTED_REGIONS:
         raise ValueError(
-            "“%s” is not a valid region code. Choices are %r"
-            % (region, phonenumbers.SUPPORTED_REGIONS)
+            f"“{region}” is not a valid region code. "
+            f"Choices are {phonenumbers.SUPPORTED_REGIONS!r}"
         )
diff -pruN 8.0.0-1/pyproject.toml 8.1.0-1/pyproject.toml
--- 8.0.0-1/pyproject.toml	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/pyproject.toml	2025-04-10 08:12:54.000000000 +0000
@@ -1,6 +1,6 @@
 [project]
 name = "django-phonenumber-field"
-requires-python = ">=3.8"
+requires-python = ">=3.9"
 description = "An international phone number field for django models."
 readme = "README.rst"
 authors = [
@@ -15,25 +15,26 @@ license = { text="MIT" }
 classifiers = [
     "Development Status :: 5 - Production/Stable",
     "Framework :: Django",
-    "Framework :: Django :: 3.2",
     "Framework :: Django :: 4.2",
     "Framework :: Django :: 5.0",
+    "Framework :: Django :: 5.1",
+    "Framework :: Django :: 5.2",
     "Intended Audience :: Developers",
     "License :: OSI Approved :: MIT License",
     "Operating System :: OS Independent",
     "Programming Language :: Python",
     "Programming Language :: Python :: 3",
     "Programming Language :: Python :: 3 :: Only",
-    "Programming Language :: Python :: 3.8",
     "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
     "Programming Language :: Python :: Implementation :: CPython",
     "Topic :: Internet :: WWW/HTTP",
 ]
 dynamic = ["version"]
-dependencies = ["Django>=3.2"]
+dependencies = ["Django>=4.2"]
 
 [project.optional-dependencies]
 phonenumbers = ["phonenumbers >= 7.0.2"]
@@ -46,8 +47,18 @@ Source = "https://github.com/stefanfouli
 Tracker = "https://github.com/stefanfoulis/django-phonenumber-field/issues/"
 Changelog = "https://github.com/stefanfoulis/django-phonenumber-field/releases/"
 
-[tool.isort]
-profile = "black"
+[tool.ruff.lint]
+# see prefixes in https://beta.ruff.rs/docs/rules/
+select = [
+    "F",   # pyflakes
+    "E",   # pycodestyle errors
+    "W",   # pycodestyle warnings
+    "I",   # isort
+    "B",   # flake8-bugbear
+    "C4",  # flake8-comprehension
+    "U",   # pyupgrade
+]
+
 
 [build-system]
 requires = [
@@ -57,7 +68,7 @@ requires = [
 build-backend = "setuptools.build_meta"
 
 [tool.mypy]
-python_version = "3.8"
+python_version = "3.9"
 check_untyped_defs = true
 show_error_context = true
 pretty = true
diff -pruN 8.0.0-1/setup.cfg 8.1.0-1/setup.cfg
--- 8.0.0-1/setup.cfg	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/setup.cfg	1970-01-01 00:00:00.000000000 +0000
@@ -1,7 +0,0 @@
-[flake8]
-max-line-length = 88
-show-source = True
-extend-exclude =
-    .env/
-    .venv/
-    venv/
diff -pruN 8.0.0-1/tests/test_formfields.py 8.1.0-1/tests/test_formfields.py
--- 8.0.0-1/tests/test_formfields.py	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/tests/test_formfields.py	2025-04-10 08:12:54.000000000 +0000
@@ -7,6 +7,7 @@ from django.core.exceptions import Impro
 from django.test import SimpleTestCase, override_settings
 from django.utils import translation
 from django.utils.functional import lazy
+from phonenumbers import COUNTRY_CODES_FOR_NON_GEO_REGIONS
 
 from phonenumber_field.formfields import PhoneNumberField, SplitPhoneNumberField
 from phonenumber_field.phonenumber import PhoneNumber
@@ -77,7 +78,7 @@ class PhoneNumberFormFieldTest(SimpleTes
             raise Exception("gettext was called unexpectedly.")
 
         with mock.patch(
-            "phonenumber_field.formfields._",
+            "phonenumber_field.formfields.pgettext_lazy",
             side_effect=lazy(fail_gettext, str),
         ):
             PhoneNumberField()
@@ -175,6 +176,8 @@ class SplitPhoneNumberFormFieldTest(Simp
         rendered = str(TestForm())
         self.assertIn('<option value="" selected>---------</option>', rendered)
         self.assertIn('<option value="CN">China +86</option>', rendered)
+        for prefix in COUNTRY_CODES_FOR_NON_GEO_REGIONS:
+            self.assertNotIn(f"+{prefix}", rendered)
 
     def test_initial(self):
         class TestForm(forms.Form):
@@ -252,10 +255,19 @@ class SplitPhoneNumberFormFieldTest(Simp
         form = TestForm(data={"phone_0": "", "phone_1": invalid_national_number})
         self.assertFalse(form.is_valid())
         rendered_form = form.as_ul()
-        self.assertInHTML(
-            '<ul class="errorlist"><li>This field is required.</li></ul>',
-            rendered_form,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """<ul class="errorlist" id="id_phone_error">
+                <li>This field is required.</li>
+                </ul>
+                """,
+                rendered_form,
+            )
+        else:
+            self.assertInHTML(
+                '<ul class="errorlist"><li>This field is required.</li></ul>',
+                rendered_form,
+            )
         aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
         # Keeps national number input.
         self.assertInHTML(
@@ -278,10 +290,20 @@ class SplitPhoneNumberFormFieldTest(Simp
         form = TestForm(data={"phone_0": "CA", "phone_1": ""})
         self.assertFalse(form.is_valid())
         rendered_form = form.as_ul()
-        self.assertInHTML(
-            '<ul class="errorlist"><li>This field is required.</li></ul>',
-            rendered_form,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_phone_error">
+                <li>This field is required.</li>
+                </ul>
+                """,
+                rendered_form,
+            )
+        else:
+            self.assertInHTML(
+                '<ul class="errorlist"><li>This field is required.</li></ul>',
+                rendered_form,
+            )
         aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
         self.assertInHTML(
             f'<input type="tel" name="phone_1" {aria_invalid} '
@@ -304,10 +326,20 @@ class SplitPhoneNumberFormFieldTest(Simp
         form = TestForm(data={"phone_1": "654321"})
         self.assertFalse(form.is_valid())
         rendered_form = form.as_ul()
-        self.assertInHTML(
-            '<ul class="errorlist"><li>This field is required.</li></ul>',
-            rendered_form,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_phone_error">
+                <li>This field is required.</li>
+                </ul>
+                """,
+                rendered_form,
+            )
+        else:
+            self.assertInHTML(
+                '<ul class="errorlist"><li>This field is required.</li></ul>',
+                rendered_form,
+            )
         aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
         self.assertInHTML(
             f'<input type="tel" name="phone_1" value="654321" {aria_invalid} '
@@ -328,11 +360,22 @@ class SplitPhoneNumberFormFieldTest(Simp
         form = TestForm(data={"phone_0": "CA"})
         self.assertFalse(form.is_valid())
         rendered_form = form.as_ul()
-        self.assertInHTML(
-            '<ul class="errorlist"><li>This field is required.</li></ul>',
-            rendered_form,
-            count=1,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_phone_error">
+                <li>This field is required.</li>
+                </ul>
+                """,
+                rendered_form,
+                count=1,
+            )
+        else:
+            self.assertInHTML(
+                '<ul class="errorlist"><li>This field is required.</li></ul>',
+                rendered_form,
+                count=1,
+            )
         aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
         self.assertInHTML(
             f'<input type="tel" name="phone_1" {aria_invalid} '
@@ -355,11 +398,22 @@ class SplitPhoneNumberFormFieldTest(Simp
         form = TestForm(data={"phone_0": "CA", "phone_1": "0000"})
         self.assertFalse(form.is_valid())
         rendered_form = str(form)
-        self.assertInHTML(
-            '<ul class="errorlist">'
-            "<li>Enter a valid phone number (e.g. (506) 234-5678).</li></ul>",
-            rendered_form,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_phone_error">
+                <li>Enter a valid phone number (e.g. (506) 234-5678).</li>
+                </ul>
+                """,
+                rendered_form,
+                count=1,
+            )
+        else:
+            self.assertInHTML(
+                '<ul class="errorlist">'
+                "<li>Enter a valid phone number (e.g. (506) 234-5678).</li></ul>",
+                rendered_form,
+            )
         aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
         self.assertInHTML(
             f'<input type="tel" name="phone_1" value="0000" {aria_invalid} '
@@ -478,32 +532,57 @@ class SplitPhoneNumberFormFieldTest(Simp
             form.errors,
             {"name": ["Ensure this value has at least 4 characters (it has 1)."]},
         )
-        self.maxDiff = None
         form_html = form.as_p()
-        aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
-        self.assertInHTML(
-            f"""
-            <ul class="errorlist">
-                <li>
-                Ensure this value has at least 4 characters (it has 1).
-                </li>
-            </ul>
-            <p>
-                <label for="id_name">Name:</label>
-                <input
-                   id="id_name"
-                   maxlength="100"
-                   minlength="4"
-                   name="name"
-                   {aria_invalid}
-                   required
-                   type="text"
-                   value="a">
-            </p>
-            """,
-            form_html,
-            count=1,
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_name_error">
+                    <li>
+                    Ensure this value has at least 4 characters (it has 1).
+                    </li>
+                </ul>
+                <p>
+                    <label for="id_name">Name:</label>
+                    <input
+                       id="id_name"
+                       maxlength="100"
+                       minlength="4"
+                       name="name"
+                       aria-describedby="id_name_error"
+                       aria-invalid="true"
+                       required
+                       type="text"
+                       value="a">
+                </p>
+                """,
+                form_html,
+                count=1,
+            )
+        else:
+            aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
+            self.assertInHTML(
+                f"""
+                <ul class="errorlist">
+                    <li>
+                    Ensure this value has at least 4 characters (it has 1).
+                    </li>
+                </ul>
+                <p>
+                    <label for="id_name">Name:</label>
+                    <input
+                       id="id_name"
+                       maxlength="100"
+                       minlength="4"
+                       name="name"
+                       {aria_invalid}
+                       required
+                       type="text"
+                       value="a">
+                </p>
+                """,
+                form_html,
+                count=1,
+            )
         self.assertInHTML(
             '<option selected value="FR">France +33</option>',
             form_html,
@@ -533,12 +612,20 @@ class SplitPhoneNumberFormFieldTest(Simp
             number = SplitPhoneNumberField()
 
         form = PhoneNumberForm({"number_0": "FR", "number_1": "1"})
-        self.assertIn(
-            '<ul class="errorlist"><li>'
-            "Enter a valid phone number (e.g. 01 23 45 67 89)."
-            "</li></ul>",
-            str(form),
-        )
+        if django.VERSION >= (5, 2):
+            self.assertIn(
+                '<ul class="errorlist" id="id_number_error"><li>'
+                "Enter a valid phone number (e.g. 01 23 45 67 89)."
+                "</li></ul>",
+                str(form),
+            )
+        else:
+            self.assertIn(
+                '<ul class="errorlist"><li>'
+                "Enter a valid phone number (e.g. 01 23 45 67 89)."
+                "</li></ul>",
+                str(form),
+            )
 
     def test_customize_invalid_error_message(self):
         class CustomSplitPhoneNumberField(SplitPhoneNumberField):
@@ -549,12 +636,21 @@ class SplitPhoneNumberFormFieldTest(Simp
             phone = CustomSplitPhoneNumberField()
 
         form = TestForm({"phone_0": "FR", "phone_1": "1"})
-        self.assertIn(
-            '<ul class="errorlist"><li>'
-            "My message using 01 23 45 67 89."
-            "</li></ul>",
-            str(form),
-        )
+        if django.VERSION >= (5, 2):
+            self.assertInHTML(
+                """
+                <ul class="errorlist" id="id_phone_error">
+                <li>My message using 01 23 45 67 89.</li>
+                </ul>
+                """,
+                str(form),
+                count=1,
+            )
+        else:
+            self.assertIn(
+                '<ul class="errorlist"><li>My message using 01 23 45 67 89.</li></ul>',
+                str(form),
+            )
 
     def test_clean_handles_invalid_input(self):
         data = [
diff -pruN 8.0.0-1/tests/tests.py 8.1.0-1/tests/tests.py
--- 8.0.0-1/tests/tests.py	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/tests/tests.py	2025-04-10 08:12:54.000000000 +0000
@@ -293,13 +293,6 @@ class PhoneNumberFieldTestCase(TestCase)
 
 
 class PhoneNumberFieldAppTest(TestCase):
-    @classmethod
-    def setUpClass(cls):
-        super().setUpClass()
-        # Drop alias with support for Django 3.2.
-        if django.VERSION < (4, 2):
-            cls.assertQuerySetEqual = cls.assertQuerysetEqual
-
     def test_save_field_to_database(self):
         """Basic Field Test"""
         tm = models.TestModel()
@@ -666,21 +659,41 @@ class RegionPhoneNumberModelFieldTest(Te
     def test_region_field_renders_invalid_numbers(self):
         form = ARPhoneNumberForm({"phone": "abcdef"})
         self.assertFalse(form.is_valid())
-        aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
-        self.assertHTMLEqual(
-            form.as_p(),
-            '<ul class="errorlist">'
-            "<li>Enter a valid phone number (e.g. 011 2345-6789) "
-            "or a number with an international call prefix.</li>"
-            "</ul>"
-            "<p>"
-            '<label for="id_phone">Phone:</label>'
-            "<input "
-            'type="tel" '
-            'name="phone" '
-            'value="abcdef" '
-            'maxlength="128" '
-            f"{aria_invalid}"
-            'id="id_phone">'
-            "</p>",
-        )
+        if django.VERSION >= (5, 2):
+            self.assertHTMLEqual(
+                form.as_p(),
+                '<ul class="errorlist" id="id_phone_error">'
+                "<li>Enter a valid phone number (e.g. 011 2345-6789) "
+                "or a number with an international call prefix.</li>"
+                "</ul>"
+                "<p>"
+                '<label for="id_phone">Phone:</label>'
+                "<input "
+                'type="tel" '
+                'name="phone" '
+                'value="abcdef" '
+                'maxlength="128" '
+                'aria-describedby="id_phone_error" '
+                'aria-invalid="true" '
+                'id="id_phone">'
+                "</p>",
+            )
+        else:
+            aria_invalid = "" if django.VERSION[0] < 5 else 'aria-invalid="true" '
+            self.assertHTMLEqual(
+                form.as_p(),
+                '<ul class="errorlist">'
+                "<li>Enter a valid phone number (e.g. 011 2345-6789) "
+                "or a number with an international call prefix.</li>"
+                "</ul>"
+                "<p>"
+                '<label for="id_phone">Phone:</label>'
+                "<input "
+                'type="tel" '
+                'name="phone" '
+                'value="abcdef" '
+                'maxlength="128" '
+                f"{aria_invalid}"
+                'id="id_phone">'
+                "</p>",
+            )
diff -pruN 8.0.0-1/tox.ini 8.1.0-1/tox.ini
--- 8.0.0-1/tox.ini	2024-06-14 11:51:18.000000000 +0000
+++ 8.1.0-1/tox.ini	2025-04-10 08:12:54.000000000 +0000
@@ -1,23 +1,32 @@
 [tox]
 envlist =
-    black
-    flake8
-    isort
-    dj32
+    ruff
     dj42
     dj50
+    dj51
+    dj52
     djmain
     mypy
 isolated_build = true
 minversion = 1.9
 
+[gh]
+python =
+    3.9 = dj42
+    3.10 = dj{42,50,51,52}
+    3.11 = dj{42,50,51,52}
+    3.12 = dj{42,50,51,52,main}
+    3.13 = dj{42,50,51,52,main}
+    3.14 = djmain
+
 [testenv]
 deps =
     babel
     coverage
-    dj32: Django>=3.2,<4.0
     dj42: Django>=4.2,<4.3
     dj50: Django>=5.0b1,<5.1
+    dj51: Django>=5.1b1,<5.2
+    dj52: Django>=5.2a1,<5.3
     djmain: https://github.com/django/django/archive/main.tar.gz
     djangorestframework
 extras = phonenumberslite
@@ -27,28 +36,11 @@ commands =
     coverage html -d coverage-reports/html
     coverage report
 
-[testenv:black]
-basepython = python3
-commands =
-    black --target-version=py38 --check --diff .
-deps =
-    black
-skip_install = true
-
-[testenv:flake8]
-commands =
-    flake8
-deps =
-    flake8
-    flake8-bugbear
-    flake8-comprehensions
-skip_install = true
-
-[testenv:isort]
+[testenv:ruff]
 commands =
-    isort --check-only --diff .
+    ruff check
 deps =
-    isort>=5.0.2
+    ruff
 skip_install = true
 
 [testenv:doctest]
