5 changed files with 170 additions and 20 deletions
-
97apps/account/messages.py
-
10apps/account/serializers/user.py
-
33apps/account/utils.py
-
13apps/account/views/auth.py
-
37apps/account/views/user.py
@ -0,0 +1,97 @@ |
|||||
|
ACCOUNT_MESSAGES = { |
||||
|
'email_already_registered': [ |
||||
|
{'language_code': 'en', 'text': 'This email is already registered.'}, |
||||
|
{'language_code': 'ru', 'text': 'Этот адрес электронной почты уже зарегистрирован.'}, |
||||
|
{'language_code': 'fa', 'text': 'این ایمیل قبلاً ثبت شده است.'}, |
||||
|
], |
||||
|
'device_id_required': [ |
||||
|
{'language_code': 'en', 'text': 'Device ID is required for guest users.'}, |
||||
|
{'language_code': 'ru', 'text': 'ID устройства обязателен для гостевых пользователей.'}, |
||||
|
{'language_code': 'fa', 'text': 'ارسال شناسه دستگاه الزامی است.'}, |
||||
|
], |
||||
|
'device_id_required_web': [ |
||||
|
{'language_code': 'en', 'text': 'Device ID is required for web guest users.'}, |
||||
|
{'language_code': 'ru', 'text': 'ID устройства обязателен для веб-гостей.'}, |
||||
|
{'language_code': 'fa', 'text': 'ارسال شناسه دستگاه برای کاربران وب الزامی است.'}, |
||||
|
], |
||||
|
'otp_sent': [ |
||||
|
{'language_code': 'en', 'text': "The otp code was sent to the user's email"}, |
||||
|
{'language_code': 'ru', 'text': 'Одноразовый код был отправлен на электронную почту пользователя.'}, |
||||
|
{'language_code': 'fa', 'text': 'کد تایید به ایمیل کاربر ارسال شد.'}, |
||||
|
], |
||||
|
'verification_data_not_found': [ |
||||
|
{'language_code': 'en', 'text': 'Verification data not found or expired.'}, |
||||
|
{'language_code': 'ru', 'text': 'Данные для подтверждения не найдены или истек срок их действия.'}, |
||||
|
{'language_code': 'fa', 'text': 'اطلاعات تایید یافت نشد یا منقضی شده است.'}, |
||||
|
], |
||||
|
'verification_code_expired': [ |
||||
|
{'language_code': 'en', 'text': 'The verification code has expired.'}, |
||||
|
{'language_code': 'ru', 'text': 'Срок действия кода подтверждения истек.'}, |
||||
|
{'language_code': 'fa', 'text': 'کد تایید منقضی شده است.'}, |
||||
|
], |
||||
|
'code_not_found': [ |
||||
|
{'language_code': 'en', 'text': 'The verification code is incorrect.'}, |
||||
|
{'language_code': 'ru', 'text': 'Неверный код подтверждения.'}, |
||||
|
{'language_code': 'fa', 'text': 'کد وارد شده صحیح نیست.'}, |
||||
|
], |
||||
|
'user_not_exists': [ |
||||
|
{'language_code': 'en', 'text': 'No user exists with this email.'}, |
||||
|
{'language_code': 'ru', 'text': 'Пользователь с такой электронной почтой не существует.'}, |
||||
|
{'language_code': 'fa', 'text': 'کاربری با این ایمیل یافت نشد.'}, |
||||
|
], |
||||
|
'password_incorrect': [ |
||||
|
{'language_code': 'en', 'text': 'Password is incorrect.'}, |
||||
|
{'language_code': 'ru', 'text': 'Неверный пароль.'}, |
||||
|
{'language_code': 'fa', 'text': 'رمز عبور اشتباه است.'}, |
||||
|
], |
||||
|
'forgot_password_sent': [ |
||||
|
{'language_code': 'en', 'text': 'Forgot password code sent.'}, |
||||
|
{'language_code': 'ru', 'text': 'Код для восстановления пароля отправлен.'}, |
||||
|
{'language_code': 'fa', 'text': 'کد بازیابی رمز عبور ارسال شد.'}, |
||||
|
], |
||||
|
'password_reset_success': [ |
||||
|
{'language_code': 'en', 'text': 'Your password has been changed successfully.'}, |
||||
|
{'language_code': 'ru', 'text': 'Ваш пароль был успешно изменен.'}, |
||||
|
{'language_code': 'fa', 'text': 'رمز عبور شما با موفقیت تغییر کرد.'}, |
||||
|
], |
||||
|
'account_deleted': [ |
||||
|
{'language_code': 'en', 'text': 'Your account has been deleted.'}, |
||||
|
{'language_code': 'ru', 'text': 'Ваша учетная запись была удалена.'}, |
||||
|
{'language_code': 'fa', 'text': 'حساب کاربری شما حذف شد.'}, |
||||
|
], |
||||
|
'user_not_found': [ |
||||
|
{'language_code': 'en', 'text': 'User does not exist.'}, |
||||
|
{'language_code': 'ru', 'text': 'Пользователь не существует.'}, |
||||
|
{'language_code': 'fa', 'text': 'کاربر یافت نشد.'}, |
||||
|
], |
||||
|
'fcm_token_required': [ |
||||
|
{'language_code': 'en', 'text': 'FCM token is required.'}, |
||||
|
{'language_code': 'ru', 'text': 'FCM-токен обязателен.'}, |
||||
|
{'language_code': 'fa', 'text': 'ارسال توکن FCM الزامی است.'}, |
||||
|
], |
||||
|
'fcm_token_updated': [ |
||||
|
{'language_code': 'en', 'text': 'FCM token updated successfully.'}, |
||||
|
{'language_code': 'ru', 'text': 'FCM-токен успешно обновлен.'}, |
||||
|
{'language_code': 'fa', 'text': 'توکن FCM با موفقیت بروزرسانی شد.'}, |
||||
|
], |
||||
|
'login_success': [ |
||||
|
{'language_code': 'en', 'text': 'Login successful.'}, |
||||
|
{'language_code': 'ru', 'text': 'Вход выполнен успешно.'}, |
||||
|
{'language_code': 'fa', 'text': 'ورود موفقیتآمیز بود.'}, |
||||
|
], |
||||
|
'token_missing': [ |
||||
|
{'language_code': 'en', 'text': 'Token not provided.'}, |
||||
|
{'language_code': 'ru', 'text': 'Токен не предоставлен.'}, |
||||
|
{'language_code': 'fa', 'text': 'توکن ارسال نشده است.'}, |
||||
|
], |
||||
|
'token_invalid_expired': [ |
||||
|
{'language_code': 'en', 'text': 'Token invalid or expired.'}, |
||||
|
{'language_code': 'ru', 'text': 'Токен недействителен или срок его действия истек.'}, |
||||
|
{'language_code': 'fa', 'text': 'توکن نامعتبر یا منقضی شده است.'}, |
||||
|
], |
||||
|
'token_invalid': [ |
||||
|
{'language_code': 'en', 'text': 'Token is invalid.'}, |
||||
|
{'language_code': 'ru', 'text': 'Токен недействителен.'}, |
||||
|
{'language_code': 'fa', 'text': 'توکن نامعتبر است.'}, |
||||
|
], |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
from django.utils.translation import get_language |
||||
|
from .messages import ACCOUNT_MESSAGES |
||||
|
|
||||
|
def get_localized_msg(key, request=None, fallback_lang="en"): |
||||
|
""" |
||||
|
Get localized message from ACCOUNT_MESSAGES based on request or active language. |
||||
|
""" |
||||
|
json_list = ACCOUNT_MESSAGES.get(key) |
||||
|
if not json_list: |
||||
|
return key # Fallback to key itself if not found |
||||
|
|
||||
|
# Get language from request (LocaleMiddleware sets LANGUAGE_CODE) |
||||
|
language_code = getattr(request, "LANGUAGE_CODE", None) if request else None |
||||
|
|
||||
|
# Check if 'lang' query param is used (common in this project's mobile apps) |
||||
|
if not language_code and request: |
||||
|
language_code = request.query_params.get('lang') |
||||
|
|
||||
|
if not language_code: |
||||
|
language_code = get_language() or fallback_lang |
||||
|
|
||||
|
# 1) Exact match |
||||
|
for item in json_list: |
||||
|
if item.get("language_code") == language_code: |
||||
|
return item.get("text") |
||||
|
|
||||
|
# 2) Fallback to English |
||||
|
for item in json_list: |
||||
|
if item.get("language_code") == "en": |
||||
|
return item.get("text") |
||||
|
|
||||
|
# 3) First available |
||||
|
return json_list[0].get("text") if json_list else key |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue