From 048c763d09c2de6fa38bfadec55e9dbb2d848f7b Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sat, 20 Dec 2025 15:37:16 +0330 Subject: [PATCH] multi language handles for references. --- apps/hadis/serializers/category.py | 36 ++++++++++------- apps/hadis/serializers/reference.py | 63 ++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 25 deletions(-) diff --git a/apps/hadis/serializers/category.py b/apps/hadis/serializers/category.py index 5d32c1a..f74feff 100644 --- a/apps/hadis/serializers/category.py +++ b/apps/hadis/serializers/category.py @@ -1,3 +1,4 @@ +from django.utils.translation import get_language from rest_framework import serializers from django.utils.translation import gettext_lazy as _ # from django.db.models import Count @@ -6,30 +7,35 @@ from ..models import HadisSect, HadisCategory, Hadis , HadisCategory class LocalizedField(serializers.Field): """ - Automatically extracts the correct language from a JSON list - based on the request's ?lang= parameter. + Extracts the correct language from a JSON list + based on request.LANGUAGE_CODE (LocaleMiddleware), + with sensible fallbacks. """ + def to_representation(self, value): - # 'value' is the raw JSON list from the database + # Expecting value to be a list of {"language_code": "...", "text": "..."} if not value or not isinstance(value, list): return None - # Get language from request query params (default to 'fa' or 'en') - request = self.context.get('request') - target_lang = request.query_params.get('lang', 'fa') if request else 'fa' - - # Logic to find the text + # Get language from request, then fall back to global language / 'fa' + request = self.context.get("request") + language_code = getattr(request, "LANGUAGE_CODE", None) if request else None + if not language_code: + language_code = get_language() or "fa" # global active language [web:164][web:172] + + # 1) Exact match with request language for item in value: - if item.get('language_code') == target_lang: - return item.get('text') # Assuming your key is 'text' + if item.get("language_code") == language_code: + return item.get("text") - # Fallback to English + # 2) Fallback to English for item in value: - if item.get('language_code') == 'en': - return item.get('text') + if item.get("language_code") == "en": + return item.get("text") - # Fallback to first item - return value[0].get('text') if value else None + # 3) Fallback to first item + first = value[0] + return first.get("text") if isinstance(first, dict) else None diff --git a/apps/hadis/serializers/reference.py b/apps/hadis/serializers/reference.py index 785b0d2..ade0e61 100644 --- a/apps/hadis/serializers/reference.py +++ b/apps/hadis/serializers/reference.py @@ -1,14 +1,19 @@ +from turtle import title from rest_framework import serializers +from django.utils.translation import get_language -from ..serializers import HadisListSerializer,HadisBasicSerializer +from ..serializers import HadisListSerializer,HadisBasicSerializer,LocalizedField from ..models import BookReference , BookAuthor , BookReferenceImage, HadisReference , BookAttribute + class BookAuthorSerializer(serializers.ModelSerializer): + name = LocalizedField() class Meta: model = BookAuthor fields = ['id','name'] class BookReferenceImageSerializer(serializers.ModelSerializer): + description = LocalizedField() class Meta: model = BookReferenceImage fields = ['id','image','description','order'] @@ -19,21 +24,55 @@ class BookReferenceSerializer(serializers.ModelSerializer): read_only = True , source = 'bookreference_set' ) + title = LocalizedField() + description = LocalizedField() author = serializers.SerializerMethodField() class Meta: model = BookReference fields = ['id','title','slug','rate','author','description','image','volume'] - def get_author (self,obj): - author = obj.authors.all() - return [ - { - 'id': author.id, - 'name': author.name - } - for author in author - ] + def get_author(self, obj): + request = self.context.get("request") + # Prefer request.LANGUAGE_CODE if you use LocaleMiddleware + language_code = getattr(request, "LANGUAGE_CODE", None) if request else None + print(language_code,1) + if not language_code: + language_code =get_language() or "en" # fallback [web:164][web:165] + + print(language_code,2) + + authors = obj.authors.all() + result = [] + + for author in authors: + # author.name is your list of dicts + name_items = author.name or [] + # find item with matching language_code + text = None + for item in name_items: + if item.get("language_code") == language_code: + print(f'we got language-code{language_code}') + text = item.get("text") + break + + # fallback: if not found, use first item or None + print(text,'this is text') + if text is None and name_items: + print('no we didnt') + + text = name_items[0].get("text") + + result.append( + { + "id": author.id, + "name": text, + } + ) + + return result class BookAttributeSerializer(serializers.ModelSerializer): + title = LocalizedField() + value = LocalizedField() class Meta: model = BookAttribute fields = ['id', 'title', 'value','book_reference'] @@ -63,6 +102,10 @@ class BookDetailSerializer(serializers.ModelSerializer): # ) hadis = serializers.SerializerMethodField() + title = LocalizedField() + language = LocalizedField() + publisher = LocalizedField() + description = LocalizedField() class Meta: model = BookReference