Add a language argument to LocalizedValue.translate(..)

This commit is contained in:
Swen Kooij 2019-10-20 16:49:33 +03:00
parent e5dcc1b492
commit 7bf0311306
2 changed files with 35 additions and 8 deletions

View File

@ -102,17 +102,32 @@ class LocalizedValue(dict):
for val in value: for val in value:
self._interpret_value(val) self._interpret_value(val)
def translate(self) -> Optional[str]: def translate(self, language: Optional[str] = None) -> Optional[str]:
"""Gets the value in the current language or falls back to the next """Gets the value in the specified language (or active language).
language if there's no value in the current language."""
fallbacks = getattr(settings, "LOCALIZED_FIELDS_FALLBACKS", {}) Arguments:
language:
The language to get the value in. If not specified,
the currently active language is used.
language = translation.get_language() or settings.LANGUAGE_CODE Returns:
languages = fallbacks.get(language, [settings.LANGUAGE_CODE])[:] The value in the specified (or active) language. If no value
languages.insert(0, language) is available in the specified language, the value is returned
in one of the fallback languages.
"""
for lang_code in languages: target_language = (
language or translation.get_language() or settings.LANGUAGE_CODE
)
fallback_config = getattr(settings, "LOCALIZED_FIELDS_FALLBACKS", {})
target_languages = fallback_config.get(
target_language, [settings.LANGUAGE_CODE]
)
target_languages.insert(0, target_language)
for lang_code in target_languages:
value = self.get(lang_code) value = self.get(lang_code)
if value: if value:
return value or None return value or None

View File

@ -172,6 +172,18 @@ class LocalizedValueTestCase(TestCase):
with translation.override("nl"): with translation.override("nl"):
assert localized_value.translate() == "ro" assert localized_value.translate() == "ro"
@staticmethod
def test_translate_custom_language():
"""Tests whether the :see:LocalizedValue class's translate() ignores
the active language when one is specified explicitely."""
localized_value = LocalizedValue(
{settings.LANGUAGE_CODE: settings.LANGUAGE_CODE, "ro": "ro"}
)
with translation.override("en"):
assert localized_value.translate("ro") == "ro"
@staticmethod @staticmethod
def test_deconstruct(): def test_deconstruct():
"""Tests whether the :see:LocalizedValue class's :see:deconstruct """Tests whether the :see:LocalizedValue class's :see:deconstruct