Skip to content

Commit 1491b05

Browse files
feat: add ability to set a custom verbose name (#770)
Co-authored-by: Serhii Tereshchenko <[email protected]>
1 parent 9aefe1f commit 1491b05

File tree

4 files changed

+33
-2
lines changed

4 files changed

+33
-2
lines changed

docs/modeltranslation/installation.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,3 +376,18 @@ Default: ``True``
376376
.. versionadded:: 0.6
377377

378378
Control if :ref:`fallback <fallback>` (both language and value) will occur.
379+
380+
381+
``MODELTRANSLATION_BUILD_LOCALIZED_VERBOSE_NAME``
382+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
383+
384+
Default: ``lambda verbose_name, lang: f"{verbose_name} [{lang}]"``
385+
386+
.. versionadded:: 0.19
387+
388+
Define a method to build localized verbose name.
389+
The verbose name by default is the field name followed by a space and the language code in brackets.
390+
391+
def get_verbose_name(verbose_name: str, lang: str):
392+
return f"{lang} - {verbose_name}"
393+
MODELTRANSLATION_BUILD_LOCALIZED_VERBOSE_NAME = get_verbose_name

modeltranslation/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from __future__ import annotations
2+
from typing import Callable
23

34
from django.conf import settings
45
from django.core.exceptions import ImproperlyConfigured
@@ -76,6 +77,12 @@
7677

7778
LOADDATA_RETAIN_LOCALE: bool = getattr(settings, "MODELTRANSLATION_LOADDATA_RETAIN_LOCALE", True)
7879

80+
BUILD_LOCALIZED_VERBOSE_NAME: Callable[[str, str], str] = getattr(
81+
settings,
82+
"MODELTRANSLATION_BUILD_LOCALIZED_VERBOSE_NAME",
83+
lambda verbose_name, lang: f"{verbose_name} [{lang}]",
84+
)
85+
7986
JQUERY_URL: str = getattr(
8087
settings,
8188
"JQUERY_URL",

modeltranslation/tests/tests.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,16 @@ def test_verbose_name(self):
270270
verbose_name = models.TestModel._meta.get_field("title_de").verbose_name
271271
assert verbose_name == "title [de]"
272272

273+
def test_custom_verbose_name(self):
274+
def get_verbose_name(verbose_name, language):
275+
return f"({language}) {verbose_name}"
276+
277+
with reload_override_settings(
278+
MODELTRANSLATION_BUILD_LOCALIZED_VERBOSE_NAME=get_verbose_name
279+
):
280+
verbose_name = models.TestModel._meta.get_field("title_de").verbose_name
281+
assert verbose_name == "(de) title"
282+
273283
def test_descriptor_introspection(self):
274284
# See Django #8248
275285
assert isinstance(models.TestModel.title.__doc__, str), (

modeltranslation/utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from typing import Any, TypeVar
66
from collections.abc import Generator, Iterable, Iterator
77
from django.db import models
8-
from django.utils.encoding import force_str
98
from django.utils.functional import lazy
109
from django.utils.translation import get_language as _get_language
1110
from django.utils.translation import get_language_info
@@ -72,7 +71,7 @@ def build_localized_fieldname(field_name: str, lang: str) -> str:
7271
def _build_localized_verbose_name(verbose_name: Any, lang: str) -> str:
7372
if lang == "id":
7473
lang = "ind"
75-
return force_str("%s [%s]") % (force_str(verbose_name), lang)
74+
return settings.BUILD_LOCALIZED_VERBOSE_NAME(verbose_name, lang)
7675

7776

7877
build_localized_verbose_name = lazy(_build_localized_verbose_name, str)

0 commit comments

Comments
 (0)