Enhance localization and fallback logic in i18n middleware
- Improved the effective language determination process by adding robust fallbacks to ensure a valid language is always used. - Updated the gettext method to include explicit fallback to English if the requested language data is unavailable. - Corrected a typo in the Russian localization for auto-renewal messaging to ensure clarity in user notifications.
This commit is contained in:
+18
-1
@@ -45,10 +45,27 @@ class JsonI18n:
|
|||||||
exc_info=True)
|
exc_info=True)
|
||||||
|
|
||||||
def gettext(self, lang_code: Optional[str], key: str, **kwargs) -> str:
|
def gettext(self, lang_code: Optional[str], key: str, **kwargs) -> str:
|
||||||
effective_lang_code = lang_code if lang_code and lang_code in self.locales_data else self.default_lang
|
# Determine effective language with robust fallback
|
||||||
|
if lang_code and lang_code in self.locales_data:
|
||||||
|
effective_lang_code = lang_code
|
||||||
|
elif self.default_lang in self.locales_data:
|
||||||
|
effective_lang_code = self.default_lang
|
||||||
|
elif 'en' in self.locales_data:
|
||||||
|
effective_lang_code = 'en'
|
||||||
|
else:
|
||||||
|
effective_lang_code = lang_code or self.default_lang
|
||||||
|
|
||||||
lang_data = self.locales_data.get(effective_lang_code)
|
lang_data = self.locales_data.get(effective_lang_code)
|
||||||
if lang_data is None:
|
if lang_data is None:
|
||||||
|
# Try explicit fallback to English if available
|
||||||
|
fallback_data = self.locales_data.get('en')
|
||||||
|
if fallback_data is not None:
|
||||||
|
text = fallback_data.get(key)
|
||||||
|
if text is not None:
|
||||||
|
try:
|
||||||
|
return text.format(**kwargs) if kwargs else text
|
||||||
|
except Exception:
|
||||||
|
return text
|
||||||
logging.warning(
|
logging.warning(
|
||||||
f"No language data for '{effective_lang_code}' (default '{self.default_lang}' also missing). Key '{key}' will be returned as is."
|
f"No language data for '{effective_lang_code}' (default '{self.default_lang}' also missing). Key '{key}' will be returned as is."
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -140,7 +140,7 @@
|
|||||||
"subscription_expired_notification": "👋 Привет, {user_name}!\n\n⛔ Срок вашей подписки на VPN истек ({end_date}).\n\nПродлите её по кнопке ниже.",
|
"subscription_expired_notification": "👋 Привет, {user_name}!\n\n⛔ Срок вашей подписки на VPN истек ({end_date}).\n\nПродлите её по кнопке ниже.",
|
||||||
"subscription_expired_yesterday_notification": "👋 Привет, {user_name}!\n\n⏳ Ваша подписка на VPN истекла сутки назад ({end_date}).\n\nПродлите её по кнопке ниже.",
|
"subscription_expired_yesterday_notification": "👋 Привет, {user_name}!\n\n⏳ Ваша подписка на VPN истекла сутки назад ({end_date}).\n\nПродлите её по кнопке ниже.",
|
||||||
"tribute_subscription_cancelled": "🚨 <b>Подписка отменена</b>\n\nВаша подписка Tribute была отменена. У вас есть 24 часа для восстановления доступа, после чего подписка будет заблокирована.\n\nДля продления подписки нажмите кнопку ниже.",
|
"tribute_subscription_cancelled": "🚨 <b>Подписка отменена</b>\n\nВаша подписка Tribute была отменена. У вас есть 24 часа для восстановления доступа, после чего подписка будет заблокирована.\n\nДля продления подписки нажмите кнопку ниже.",
|
||||||
"yookassa_auto_renewal": "🔄 <b>Подписка автоматически продлена</b>\n\nВаша подписка была автоматически продлена на {months} мес.\nНовая дата окончания: {end_date}",
|
"yookassa_auto_renewal": "🔄 <b>Подписка автоматически продлена</b>\n\nВаша подписка была автоматически продлена на {months} мес.\nНовая дата окончания: {end_date}",
|
||||||
"admin_promo_set_validity_days": "⏰ Установить срок (дни)",
|
"admin_promo_set_validity_days": "⏰ Установить срок (дни)",
|
||||||
"admin_back_to_panel": "⬅️ В панель",
|
"admin_back_to_panel": "⬅️ В панель",
|
||||||
"admin_promo_unlimited": "♾️ Неограниченно",
|
"admin_promo_unlimited": "♾️ Неограниченно",
|
||||||
|
|||||||
Reference in New Issue
Block a user