Browse Source

admin live chat translation to russian added.

master
Mohsen Taba 2 months ago
parent
commit
f6306f13b5
  1. 23
      apps/chat/admin_views.py
  2. 4419
      locale/fa/LC_MESSAGES/django.po
  3. 1199
      locale/ru/LC_MESSAGES/django.po
  4. 10
      static/js/live_chat.js
  5. 27
      templates/admin/chat/live_chat.html
  6. 18
      utils/unfold_translations.py

23
apps/chat/admin_views.py

@ -63,8 +63,10 @@ def api_get_rooms(request):
data = []
for r in rooms:
title = r.name or f"Room #{r.id}"
if r.room_type == 'group' and r.course:
title = r.name or _("Room #{}").format(r.id)
if r.room_type == 'private' and title and title.startswith("Chat with "):
title = _("Chat with {}").format(title[10:])
elif r.room_type == 'group' and r.course:
title = r.course.title
unread_count = getattr(r, 'admin_unread_count', 0)
@ -106,7 +108,7 @@ def api_get_messages(request, room_id):
data = []
for m in messages:
avatar = m.sender.avatar.url if getattr(m.sender, 'avatar', None) else None
sender_name = m.sender.fullname or m.sender.email or "Unknown"
sender_name = m.sender.fullname or m.sender.email or _("Unknown")
data.append({
"id": m.id,
@ -148,7 +150,7 @@ def api_send_message(request, room_id):
# 🟢 ساخت ساختار JSON پیام دقیقاً شبیه به چیزی که FastAPI به فرانت می‌فرستد
avatar_url = request.user.avatar.url if getattr(request.user, 'avatar', None) else None
sender_name = request.user.fullname or request.user.email or "Support"
sender_name = request.user.fullname or request.user.email or _("Support")
message_data = {
"id": msg.id,
@ -200,12 +202,16 @@ def api_get_users(request):
users_qs = users_qs.order_by('-date_joined')[:50] # محدود کردن به 50 نفر اول
data = []
from django.utils.translation import gettext as _gt
for u in users_qs:
role = getattr(u, 'user_type', 'Member') or 'Member'
translated_role = _gt(str(role).capitalize())
name = u.fullname or u.email
data.append({
"id": u.id,
"name": name,
"role": getattr(u, 'user_type', 'Member')
"role": translated_role
})
return JsonResponse({"users": data})
@ -237,10 +243,13 @@ def api_create_or_get_room(request):
if existing_room:
# روم از قبل وجود دارد
title = existing_room.name or recipient.fullname or recipient.email
if title and title.startswith("Chat with "):
title = _("Chat with {}").format(title[10:])
return JsonResponse({
"success": True,
"room_id": existing_room.id,
"title": existing_room.name or recipient.fullname or recipient.email
"title": title
})
# روم وجود ندارد، می‌سازیم
@ -254,7 +263,7 @@ def api_create_or_get_room(request):
return JsonResponse({
"success": True,
"room_id": new_room.id,
"title": new_room.name
"title": _("Chat with {}").format(recipient.fullname or recipient.email)
})
except Exception as e:

4419
locale/fa/LC_MESSAGES/django.po
File diff suppressed because it is too large
View File

1199
locale/ru/LC_MESSAGES/django.po
File diff suppressed because it is too large
View File

10
static/js/live_chat.js

@ -59,13 +59,13 @@ document.addEventListener('DOMContentLoaded', function () {
renderUsers(data.users);
} catch (e) {
console.error("Failed to fetch users:", e);
UI.usersList.innerHTML = '<p class="text-center text-red-400 mt-4 text-sm">Failed to load users.</p>';
UI.usersList.innerHTML = `<p class="text-center text-red-400 mt-4 text-sm">${window.CHAT_CONFIG.trans.failedToLoadUsers}</p>`;
}
}
function renderUsers(users) {
if (users.length === 0) {
UI.usersList.innerHTML = '<p class="text-center text-gray-500 mt-6 text-sm font-medium">No users found.</p>';
UI.usersList.innerHTML = `<p class="text-center text-gray-500 mt-6 text-sm font-medium">${window.CHAT_CONFIG.trans.noUsersFound}</p>`;
return;
}
@ -131,7 +131,7 @@ document.addEventListener('DOMContentLoaded', function () {
function renderRooms(rooms) {
if (rooms.length === 0) {
UI.roomList.innerHTML = '<p class="text-center text-sm text-gray-500 mt-10 px-4">No active chats found.</p>';
UI.roomList.innerHTML = `<p class="text-center text-sm text-gray-500 mt-10 px-4">${window.CHAT_CONFIG.trans.noActiveChatsFound}</p>`;
return;
}
@ -154,7 +154,7 @@ document.addEventListener('DOMContentLoaded', function () {
<span class="text-[11px] text-gray-400 whitespace-nowrap flex-shrink-0">${room.time}</span>
</div>
<div class="flex justify-between items-center">
<span class="text-[12px] font-medium text-gray-500 truncate">${room.type === 'group' ? '👥 Group Chat' : '👤 Private Chat'}</span>
<span class="text-[12px] font-medium text-gray-500 truncate">${room.type === 'group' ? '👥 ' + window.CHAT_CONFIG.trans.groupChat : '👤 ' + window.CHAT_CONFIG.trans.privateChat}</span>
${room.unread > 0 ? `<span class="shadow-sm text-[10px] font-bold rounded-full unread-badge">${room.unread}</span>` : ''}
</div>
</div>
@ -214,7 +214,7 @@ document.addEventListener('DOMContentLoaded', function () {
lastMessageId = data.messages[data.messages.length - 1].id;
scrollToBottom();
} else if (lastMessageId === 0) {
UI.messages.innerHTML = '<div class="flex flex-col items-center justify-center h-full text-gray-400 gap-2"><span class="material-symbols-outlined text-5xl opacity-30">chat</span><p class="text-sm font-medium">No messages yet. Start the conversation!</p></div>';
UI.messages.innerHTML = `<div class="flex flex-col items-center justify-center h-full text-gray-400 gap-2"><span class="material-symbols-outlined text-5xl opacity-30">chat</span><p class="text-sm font-medium">${window.CHAT_CONFIG.trans.noMessagesYet}</p></div>`;
}
} catch (e) {
console.error("Failed to fetch messages:", e);

27
templates/admin/chat/live_chat.html

@ -110,26 +110,27 @@
</span>
</div>
<div id="no-chat-selected"
class="flex-1 flex flex-col items-center justify-center w-full p-8 z-30"
<div id="no-chat-selected" class="flex-1 flex flex-col items-center justify-center w-full p-8 z-30"
style="transform: translateY(64px);">
<div
class="w-20 h-20 mx-auto mb-6 bg-gradient-to-br from-[#0A522E]/10 to-[#0A522E]/20 dark:from-[#FAF6E9]/10 dark:to-[#FAF6E9]/20 rounded-full flex items-center justify-center shadow-inner">
<span
class="material-symbols-outlined text-5xl text-[#0A522E] dark:text-[#FAF6E9] opacity-90">chat</span>
</div>
<h3 class="text-lg font-semibold text-[#052B18] dark:text-[#FAF6E9] mb-2 text-center">No Chat Selected</h3>
<p class="text-sm font-medium opacity-80 text-[#0A522E] dark:text-[#FAF6E9] text-center">Select a chat from
the sidebar to start messaging</p>
<h3 class="text-lg font-semibold text-[#052B18] dark:text-[#FAF6E9] mb-2 text-center">{% trans "No Chat Selected" %}</h3>
<p class="text-sm font-medium opacity-80 text-[#0A522E] dark:text-[#FAF6E9] text-center">{% trans "Select a chat from the sidebar to start messaging" %}</p>
</div>
<div id="chat-messages" class="chat-messages flex-1 hidden"></div>
<div id="chat-input-area" class="message-input-area w-full !w-full !max-w-none flex-shrink-0 px-6 py-4 mt-auto hidden z-20">
<div id="chat-input-area"
class="message-input-area w-full !w-full !max-w-none flex-shrink-0 px-6 py-4 mt-auto hidden z-20">
<form id="chat-form" class="flex items-end gap-3 w-full !w-full !max-w-none m-0">
<div class="telegram-input-container flex-1 w-full flex items-end">
<textarea id="chat-input" class="telegram-message-input w-full resize-none overflow-y-auto chat-scrollbar"
rows="1" placeholder="{% trans 'Type your message...' %}" style="min-height: 24px; max-height: 150px; line-height: 1.5;"></textarea>
<textarea id="chat-input"
class="telegram-message-input w-full resize-none overflow-y-auto chat-scrollbar" rows="1"
placeholder="{% trans 'Type your message...' %}"
style="min-height: 24px; max-height: 150px; line-height: 1.5;"></textarea>
</div>
<button type="submit" id="send-btn" class="telegram-action-btn send-btn-telegram shadow-md">
<span class="material-symbols-outlined text-[20px] ml-1">send</span>
@ -147,7 +148,15 @@
apiUrlMessagesBase: '{% url "admin:live_chat_api_messages" room_id=0 %}'.replace('0/', ''),
apiUrlSendBase: '{% url "admin:live_chat_api_send" room_id=0 %}'.replace('0/', ''),
apiUrlUsers: '{% url "admin:live_chat_api_users" %}', // روت جدید برای گرفتن کاربران
apiUrlCreateRoom: '{% url "admin:live_chat_api_create_room" %}' // روت جدید برای ساخت روم
apiUrlCreateRoom: '{% url "admin:live_chat_api_create_room" %}', // روت جدید برای ساخت روم
trans: {
failedToLoadUsers: "{% trans 'Failed to load users.' %}",
noUsersFound: "{% trans 'No users found.' %}",
noActiveChatsFound: "{% trans 'No active chats found.' %}",
groupChat: "{% trans 'Group Chat' %}",
privateChat: "{% trans 'Private Chat' %}",
noMessagesYet: "{% trans 'No messages yet. Start the conversation!' %}"
}
};
</script>
<script src="{% static 'js/live_chat.js' %}"></script>

18
utils/unfold_translations.py

@ -96,5 +96,23 @@ UNFOLD_CUSTOM_STRINGS = [
_("Dovodbi Application"),
_("Updated Today"),
_("Requires Action"),
_("No Chat Selected"),
_("Select a chat from the sidebar to start messaging"),
_("Failed to load users."),
_("No users found."),
_("No active chats found."),
_("Group Chat"),
_("Private Chat"),
_("No messages yet. Start the conversation!"),
_("Room #{}"),
_("Unknown"),
_("Support"),
_("Student"),
_("Professor"),
_("Consultant"),
_("Member"),
_("Admin"),
_("Staff"),
_("Chat with {}"),
]
Loading…
Cancel
Save