diff --git a/apps/search_indexes/filters.py b/apps/search_indexes/filters.py index f9ae0ef1..93208a71 100644 --- a/apps/search_indexes/filters.py +++ b/apps/search_indexes/filters.py @@ -1,7 +1,7 @@ """Search indexes filters.""" from elasticsearch_dsl.query import Q from django_elasticsearch_dsl_drf.filter_backends import SearchFilterBackend -from utils.models import get_current_language +from utils.models import get_current_locale class CustomSearchFilterBackend(SearchFilterBackend): @@ -12,7 +12,7 @@ class CustomSearchFilterBackend(SearchFilterBackend): field_name = field if hasattr(view, 'search_fields') and hasattr(view, 'translated_search_fields'): if field in view.translated_search_fields: - field_name = f'{field}.{get_current_language()}' + field_name = f'{field}.{get_current_locale()}' return field_name def construct_search(self, request, view): diff --git a/apps/search_indexes/utils.py b/apps/search_indexes/utils.py index 0c1dd187..d6153da2 100644 --- a/apps/search_indexes/utils.py +++ b/apps/search_indexes/utils.py @@ -1,6 +1,6 @@ """Search indexes utils.""" from django_elasticsearch_dsl import fields -from utils.models import get_current_language +from utils.models import get_current_locale, get_default_locale # object field properties @@ -19,4 +19,8 @@ def get_translated_value(value): field_dict = value.to_dict() elif isinstance(value, dict): field_dict = value - return field_dict.get(get_current_language()) + value = field_dict.get(get_current_locale()) + # fallback + if value is None: + value = field_dict.get(get_default_locale()) + return value diff --git a/apps/utils/models.py b/apps/utils/models.py index 0c94d23f..55512e88 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -10,6 +10,7 @@ from django.contrib.postgres.fields.jsonb import KeyTextTransform from django.utils import timezone from django.utils.html import mark_safe from django.utils.translation import ugettext_lazy as _, get_language +from configuration.models import TranslationSettings from easy_thumbnails.fields import ThumbnailerImageField from sorl.thumbnail import get_thumbnail from sorl.thumbnail.fields import ImageField as SORLImageField @@ -59,13 +60,26 @@ def to_locale(language): return language + '-' + country +def get_current_locale(): + """Get current language.""" + return to_locale(get_language()) + + +def get_default_locale(): + return TranslationSettings.get_solo().default_language or \ + settings.FALLBACK_LOCALE + + def translate_field(self, field_name): def translate(self): field = getattr(self, field_name) if isinstance(field, dict): - return field.get(to_locale(get_language())) + value = field.get(to_locale(get_language())) + # fallback + if value is None: + value = field.get(get_default_locale()) + return value return None - return translate @@ -111,15 +125,10 @@ class TranslatedFieldsMixin: if self.STR_FIELD_NAME: field = getattr(self, getattr(self, 'STR_FIELD_NAME')) if isinstance(field, dict): - value = field.get(get_current_language()) + value = field.get(get_current_locale()) return value if value else super(TranslatedFieldsMixin, self).__str__() -def get_current_language(): - """Get current language.""" - return to_locale(get_language()) - - class OAuthProjectMixin: """OAuth2 mixin for project GM""" diff --git a/project/settings/base.py b/project/settings/base.py index d2cf7b49..731d73a5 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -488,3 +488,5 @@ MEDIA_LOCATION = 'media' PHONENUMBER_DB_FORMAT = 'NATIONAL' PHONENUMBER_DEFAULT_REGION = "FR" + +FALLBACK_LOCALE = 'en-GB'