From 7db7a20a1df3b0112068a72a65cb2ecf0bcffaec Mon Sep 17 00:00:00 2001 From: NW Date: Thu, 25 Jun 2026 23:06:58 +0100 Subject: [PATCH] feat: always show language selector on /start, add change_language button in profile - /start now always shows language picker (removed language_set check) - Added 'Change Language' button in profile inline keyboard - Added handleChangeLanguage callback handler - Added profile.change_language locale key in en/es/de - Registered change_language callback route --- src/handlers/userHandlers/userHandler.js | 50 ++++++++++++------------ src/i18n/locales/de.json | 1 + src/i18n/locales/en.json | 1 + src/i18n/locales/es.json | 1 + src/router/routes.js | 4 ++ 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/handlers/userHandlers/userHandler.js b/src/handlers/userHandlers/userHandler.js index d01c2f4..003d1bd 100644 --- a/src/handlers/userHandlers/userHandler.js +++ b/src/handlers/userHandlers/userHandler.js @@ -79,6 +79,7 @@ ${t('profile.member_since')}: ${new Date(userStats.created_at).toLocaleDateStrin const keyboard = { inline_keyboard: [ [{text: t('profile.set_location'), callback_data: 'set_location'}], + [{text: t('profile.change_language'), callback_data: 'change_language'}], [{text: t('profile.delete_account'), callback_data: 'delete_account'}] ] }; @@ -104,33 +105,13 @@ ${t('profile.member_since')}: ${new Date(userStats.created_at).toLocaleDateStrin username: username }); - const user = await UserService.getUserByTelegramId(telegramId); - const lang = user?.language; - - if (!user?.language_set) { - const keyboard = { - inline_keyboard: AVAILABLE_LANGUAGES.map(code => [{ - text: LANGUAGE_NAMES[code], - callback_data: `set_language_${code}` - }]) - }; - await bot.sendMessage(chatId, tForUser('en')('bot.language_select'), { reply_markup: keyboard }); - return; - } - - const t = tForUser(lang); - const keyboard = { - reply_markup: { - keyboard: [ - [t('keyboard.products'), t('keyboard.profile')], - [t('keyboard.purchases'), t('keyboard.wallets')] - ], - resize_keyboard: true - } + inline_keyboard: AVAILABLE_LANGUAGES.map(code => [{ + text: LANGUAGE_NAMES[code], + callback_data: `set_language_${code}` + }]) }; - - await bot.sendMessage(chatId, t('bot.welcome'), keyboard); + await bot.sendMessage(chatId, tForUser('en')('bot.language_select'), { reply_markup: keyboard }); } catch (error) { logger.error({ err: error }, 'Error in handleStart'); const fallbackT = tForUser('en'); @@ -172,6 +153,25 @@ ${t('profile.member_since')}: ${new Date(userStats.created_at).toLocaleDateStrin } } + static async handleChangeLanguage(callbackQuery) { + const chatId = callbackQuery.message.chat.id; + const user = callbackQuery.message.__user || await UserService.getUserByTelegramId(callbackQuery.from.id); + const currentLang = user?.language || 'en'; + + const keyboard = { + inline_keyboard: AVAILABLE_LANGUAGES.map(code => [{ + text: LANGUAGE_NAMES[code], + callback_data: `set_language_${code}` + }]) + }; + + try { + await bot.deleteMessage(chatId, callbackQuery.message.message_id); + } catch {} + + await bot.sendMessage(chatId, tForUser(currentLang)('bot.language_select'), { reply_markup: keyboard }); + } + static async handleLanguageCommand(msg) { const chatId = msg.chat.id; diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 14e0958..1a3f862 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -23,6 +23,7 @@ "available_balance": "Verfügbares Guthaben", "member_since": "📅 Mitglied seit", "set_location": "📍 Standort festlegen", + "change_language": "🌐 Sprache ändern", "delete_account": "❌ Konto löschen", "error_loading": "Fehler beim Laden des Profils. Bitte versuche es erneut." }, diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index dee00bb..11df1fb 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -23,6 +23,7 @@ "available_balance": "Available Balance", "member_since": "📅 Member since", "set_location": "📍 Set Location", + "change_language": "🌐 Change Language", "delete_account": "❌ Delete Account", "error_loading": "Error loading profile. Please try again." }, diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json index 4da2500..71f4a40 100644 --- a/src/i18n/locales/es.json +++ b/src/i18n/locales/es.json @@ -23,6 +23,7 @@ "available_balance": "Saldo disponible", "member_since": "📅 Miembro desde", "set_location": "📍 Establecer ubicación", + "change_language": "🌐 Cambiar idioma", "delete_account": "❌ Eliminar cuenta", "error_loading": "Error al cargar perfil. Inténtalo de nuevo." }, diff --git a/src/router/routes.js b/src/router/routes.js index e938046..80dbeb5 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -86,6 +86,10 @@ export function registerRoutes() { logDebug(cq.data, 'handleSetLocation'); await userLocationHandler.handleSetLocation(cq); }); + callbackRouter.registerExact('change_language', async (cq) => { + logDebug(cq.data, 'handleChangeLanguage'); + await userHandler.handleChangeLanguage(cq); + }); callbackRouter.registerExact('back_to_profile', async (cq) => { logDebug(cq.data, 'handleBackToProfile'); await userHandler.handleBackToProfile(cq);