Browse Source

multi language handles for references.

master
Mohsen Taba 5 months ago
parent
commit
048c763d09
  1. 34
      apps/hadis/serializers/category.py
  2. 63
      apps/hadis/serializers/reference.py

34
apps/hadis/serializers/category.py

@ -1,3 +1,4 @@
from django.utils.translation import get_language
from rest_framework import serializers from rest_framework import serializers
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
# from django.db.models import Count # from django.db.models import Count
@ -6,30 +7,35 @@ from ..models import HadisSect, HadisCategory, Hadis , HadisCategory
class LocalizedField(serializers.Field): 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): 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): if not value or not isinstance(value, list):
return None 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'
# 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]
# Logic to find the text
# 1) Exact match with request language
for item in value: 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: 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

63
apps/hadis/serializers/reference.py

@ -1,14 +1,19 @@
from turtle import title
from rest_framework import serializers 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 from ..models import BookReference , BookAuthor , BookReferenceImage, HadisReference , BookAttribute
class BookAuthorSerializer(serializers.ModelSerializer): class BookAuthorSerializer(serializers.ModelSerializer):
name = LocalizedField()
class Meta: class Meta:
model = BookAuthor model = BookAuthor
fields = ['id','name'] fields = ['id','name']
class BookReferenceImageSerializer(serializers.ModelSerializer): class BookReferenceImageSerializer(serializers.ModelSerializer):
description = LocalizedField()
class Meta: class Meta:
model = BookReferenceImage model = BookReferenceImage
fields = ['id','image','description','order'] fields = ['id','image','description','order']
@ -19,21 +24,55 @@ class BookReferenceSerializer(serializers.ModelSerializer):
read_only = True , read_only = True ,
source = 'bookreference_set' source = 'bookreference_set'
) )
title = LocalizedField()
description = LocalizedField()
author = serializers.SerializerMethodField() author = serializers.SerializerMethodField()
class Meta: class Meta:
model = BookReference model = BookReference
fields = ['id','title','slug','rate','author','description','image','volume'] 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): class BookAttributeSerializer(serializers.ModelSerializer):
title = LocalizedField()
value = LocalizedField()
class Meta: class Meta:
model = BookAttribute model = BookAttribute
fields = ['id', 'title', 'value','book_reference'] fields = ['id', 'title', 'value','book_reference']
@ -63,6 +102,10 @@ class BookDetailSerializer(serializers.ModelSerializer):
# ) # )
hadis = serializers.SerializerMethodField() hadis = serializers.SerializerMethodField()
title = LocalizedField()
language = LocalizedField()
publisher = LocalizedField()
description = LocalizedField()
class Meta: class Meta:
model = BookReference model = BookReference

Loading…
Cancel
Save