🌍 Gestion des Langues
Rendre votre bot multilingue — détection automatique de la langue de l'utilisateur et sélection manuelle avec persistance via Properties
Introduction
BotStrike offre deux approches pour gérer la langue de vos utilisateurs :
🔍 Détection automatique
Telegram transmet la langue du client de l'utilisateur via user.language_code. Vous pouvez l'utiliser directement pour adapter vos réponses sans rien demander à l'utilisateur.
🎯 Sélection manuelle
L'utilisateur choisit sa langue via des boutons inline. La préférence est sauvegardée avec User.setProp / bot.setUserProp et utilisée pour toutes les commandes suivantes.
Détection automatique
Chaque utilisateur Telegram a un language_code (ex : "fr", "en", "ru", "es"). BotStrike le rend accessible directement dans le contexte utilisateur.
Accéder à la langue
const lang = user.language_code; // "fr", "en", "ru", "es", etc.
if (lang === "fr") {
Bot.sendMessage("Bonjour ! 🇫🇷");
} else if (lang === "ru") {
Bot.sendMessage("Привет! 🇷🇺");
} else if (lang === "es") {
Bot.sendMessage("¡Hola! 🇪🇸");
} else {
Bot.sendMessage("Hello! 🇬🇧");
}
Avec un objet de traductions
const messages = {
fr: "Bienvenue dans notre bot ! 🎉",
en: "Welcome to our bot! 🎉",
ru: "Добро пожаловать в нашего бота! 🎉",
es: "¡Bienvenido a nuestro bot! 🎉"
};
const lang = user.language_code || "en";
const key = lang.substring(0, 2); // "fr-FR" → "fr"
Bot.sendMessage(messages[key] || messages.en);
Accéder à la langue
lang = user.get("language_code", "en") # "fr", "en", "ru", etc.
if lang == "fr":
bot.sendMessage("Bonjour ! 🇫🇷")
elif lang == "ru":
bot.sendMessage("Привет! 🇷🇺")
elif lang == "es":
bot.sendMessage("¡Hola! 🇪🇸")
else:
bot.sendMessage("Hello! 🇬🇧")
Avec un dictionnaire de traductions
messages = {
"fr": "Bienvenue dans notre bot ! 🎉",
"en": "Welcome to our bot! 🎉",
"ru": "Добро пожаловать в нашего бота! 🎉",
"es": "¡Bienvenido a nuestro bot! 🎉"
}
lang = user.get("language_code", "en")
key = lang[:2] # "fr-FR" → "fr"
bot.sendMessage(messages.get(key, messages["en"]))
language_code reflète la langue de l'application Telegram, pas forcément la langue parlée par l'utilisateur. Un francophone peut avoir Telegram en anglais.
Sélection manuelle avec Properties
Pour une gestion fiable, proposez un menu de sélection de langue avec des boutons inline. La préférence est stockée dans les User Properties et reste accessible dans toutes les commandes.
📋 Flux en deux commandes
/selectyourlang— Affiche les drapeaux en boutons inline/reponse— Reçoit le callback, extrait la langue, la sauvegarde avecsetProp
Le nom du callback contient le suffixe de langue (ex : /reponse fr, /reponse ru). La commande /reponse récupère ce suffixe et le stocke.
Bot.deleteMessage() / bot.deleteMessage() pour garder le chat propre, puis envoyez une confirmation dans la langue choisie.
Commande /selectyourlang
Cette commande affiche un message avec 4 boutons de langue. Chaque bouton déclenche un callback vers la commande /reponse avec le code langue en suffixe.
// Commande : /selectyourlang
Bot.sendMessage("🌍 Choisissez votre langue / Choose your language:", {
keyboard: [
[
{ text: "🇫🇷 Français", callback: "/reponse fr" },
{ text: "🇷🇺 Русский", callback: "/reponse ru" }
],
[
{ text: "🇬🇧 English", callback: "/reponse en" },
{ text: "🇪🇸 Español", callback: "/reponse es" }
]
]
});
# Commande : /selectyourlang
bot.sendMessage("🌍 Choisissez votre langue / Choose your language:", {
"keyboard": [
[
{"text": "🇫🇷 Français", "callback": "/reponse fr"},
{"text": "🇷🇺 Русский", "callback": "/reponse ru"}
],
[
{"text": "🇬🇧 English", "callback": "/reponse en"},
{"text": "🇪🇸 Español", "callback": "/reponse es"}
]
]
})
/reponse avec le paramètre "fr". Le suffixe est accessible via user.callback_suffix (JS) ou user.get("callback_suffix") (Python).
Commande /reponse
Cette commande reçoit le callback, extrait la langue choisie, la sauvegarde dans les User Properties, supprime le message de sélection et envoie une confirmation.
// Commande : /reponse
// Récupère le suffixe du callback (ex: "fr", "ru", "en, "es")
const lang = user.callback_suffix;
if (!lang) return;
// Sauvegarder la langue choisie dans les User Properties
User.setProp("lang", lang);
// Supprimer le message avec les boutons
Bot.deleteMessage(user.message_id);
// Messages de confirmation par langue
const confirmations = {
fr: "✅ Langue définie : Français 🇫🇷",
ru: "✅ Язык установлен: Русский 🇷🇺",
en: "✅ Language set: English 🇬🇧",
es: "✅ Idioma seleccionado: Español 🇪🇸"
};
Bot.sendMessage(confirmations[lang] || confirmations.en);
# Commande : /reponse
# Récupère le suffixe du callback (ex: "fr", "ru", "en", "es")
lang = user.get("callback_suffix", "")
if not lang:
return
# Sauvegarder la langue choisie dans les User Properties
bot.setUserProp("lang", lang)
# Supprimer le message avec les boutons
bot.deleteMessage(user.get("message_id"))
# Messages de confirmation par langue
confirmations = {
"fr": "✅ Langue définie : Français 🇫🇷",
"ru": "✅ Язык установлен: Русский 🇷🇺",
"en": "✅ Language set: English 🇬🇧",
"es": "✅ Idioma seleccionado: Español 🇪🇸"
}
bot.sendMessage(confirmations.get(lang, confirmations["en"]))
Exemple complet — Bot multilingue
Voici un exemple de commande /start qui utilise la langue sauvegardée (si elle existe) ou la détection automatique comme fallback.
// Commande : /start
// 1. Vérifier si l'utilisateur a déjà choisi une langue manuellement
let lang = User.getProp("lang");
// 2. Sinon, utiliser la détection automatique de Telegram
if (!lang) {
lang = (user.language_code || "en").substring(0, 2);
}
// 3. Définir les traductions
const texts = {
fr: {
welcome: "👋 Bienvenue ! Je suis votre assistant.",
help: "Tapez /help pour voir les commandes.",
lang_btn: "🌍 Changer de langue"
},
ru: {
welcome: "👋 Добро пожаловать! Я ваш помощник.",
help: "Введите /help для списка команд.",
lang_btn: "🌍 Изменить язык"
},
en: {
welcome: "👋 Welcome! I'm your assistant.",
help: "Type /help to see commands.",
lang_btn: "🌍 Change language"
},
es: {
welcome: "👋 ¡Bienvenido! Soy tu asistente.",
help: "Escribe /help para ver los comandos.",
lang_btn: "🌍 Cambiar idioma"
}
};
const t = texts[lang] || texts.en;
Bot.sendMessage(t.welcome + "\n" + t.help, {
keyboard: [
[{ text: t.lang_btn, callback: "/selectyourlang" }]
]
});
# Commande : /start
# 1. Vérifier si l'utilisateur a déjà choisi une langue
lang = bot.getUserProp("lang")
# 2. Sinon, utiliser la détection automatique de Telegram
if not lang:
lang = user.get("language_code", "en")[:2]
# 3. Définir les traductions
texts = {
"fr": {
"welcome": "👋 Bienvenue ! Je suis votre assistant.",
"help": "Tapez /help pour voir les commandes.",
"lang_btn": "🌍 Changer de langue"
},
"ru": {
"welcome": "👋 Добро пожаловать! Я ваш помощник.",
"help": "Введите /help для списка команд.",
"lang_btn": "🌍 Изменить язык"
},
"en": {
"welcome": "👋 Welcome! I'm your assistant.",
"help": "Type /help to see commands.",
"lang_btn": "🌍 Change language"
},
"es": {
"welcome": "👋 ¡Bienvenido! Soy tu asistente.",
"help": "Escribe /help para ver los comandos.",
"lang_btn": "🌍 Cambiar idioma"
}
}
t = texts.get(lang, texts["en"])
bot.sendMessage(t["welcome"] + "\n" + t["help"], {
"keyboard": [
[{"text": t["lang_btn"], "callback": "/selectyourlang"}]
]
})
Bonnes pratiques
📝 Organisation des traductions
- Centralisez vos textes dans un objet/dictionnaire en haut de chaque commande
- Utilisez des clés cohérentes (
welcome,help,error, etc.) - Prévoyez toujours un fallback vers l'anglais (
texts[lang] || texts.en)
🔄 Priorité de détection
- User Property — Langue choisie manuellement (priorité haute)
- language_code — Langue détectée automatiquement (fallback)
- Valeur par défaut — Anglais si rien n'est disponible
⚡ Performance
User.getProp("lang")est rapide — pas d'hésitation à l'appeler dans chaque commande- Évitez les fichiers de traduction volumineux — gardez les textes dans le code de chaque commande
- Pour les bots avec 10+ langues, utilisez une Bot Property contenant un objet JSON de traductions globales
user.language_code pour la détection automatique, User.setProp("lang", ...) / bot.setUserProp("lang", ...) pour la sauvegarde manuelle, et un fallback anglais systématique.
🌍 Détection réelle (pays + fuseau horaire)
Pour aller plus loin que language_code (qui peut être en partout dans le monde), la lib LocalInfo détecte le pays réel, l'heure locale et le fuseau horaire de l'utilisateur via un widget Telegram.
Étape 1 — Demander la détection
# Python
url = Bs.localInfoUrl(user["id"], "/got_local")
Bot.sendButtons("📝 Cliquez pour confirmer votre langue :", [
{"text": "🌍 Détecter ma langue", "url": url}
])
Étape 2 — Récupérer les infos (commande /got_local)
info = Bs.localInfo(user["id"]) # info = { # "pays": "France", "country": "France", # "heure": "14:30:25", "time12": "2:30 PM", "time24": "14:30", # "date": "06/05/2026", "dateISO": "2026-05-06", # "timezone": "Europe/Paris" # } # Mapper pays → langue pays_to_lang = {"France": "fr", "España": "es", "Deutschland": "de", "Italia": "it"} lang = pays_to_lang.get(info["pays"], "en") User.setProp("lang", lang) User.setProp("timezone", info["timezone"]) Bot.sendMessage(f"✅ Détecté : {info['pays']} ({lang}) — il est {info['heure']}")
JavaScript équivalent
let url = Bs.localInfoUrl(user.id, "/got_local");
Bot.sendButtons("📝 Confirmez votre langue :", [
{ text: "🌍 Détecter", url: url }
]);
// /got_local.js
let info = Bs.localInfo(user.id);
let lang = ({ "France": "fr", "España": "es" })[info.pays] || "en";
User.setProp("lang", lang);
User.setProp("timezone", info.timezone);
Bot.sendMessage(`✅ ${info.pays} (${lang}) — il est ${info.heure}`);