
Step-by-Step Multilingual Commands
功能定位与变更脉络
2025 年 6 月发布的 Bot API 7.8 将「Multilingual Commands」从实验性标记移至正式对象,核心变化有三点:1) 命令描述不再依赖 setMyCommands 的单一语言数组,而是支持 language_code 作为一级键;2) 客户端(Android 10.12 / iOS 10.12 / macOS 8.9)在侧滑命令面板与输入提示中,会优先匹配用户系统语言,缺失则回落到 en;3) 同一机器人最多同时注册 100 条命令 × 10 种语言,计入原有 100 条上限,而非叠加。此举解决了旧版方案中开发者需自行维护用户语言偏好表、并通过 editMessageText 二次刷新的高成本问题。
与相近功能对比,setMyDescription 的本地化仅影响机器人资料页,而 multilingual commands 直接作用于交互入口,因此更适合高频指令型 Bot;若你的 Bot 以按钮菜单为主、命令仅做兜底,则收益有限。
版本演进带来的取舍
经验性观察:在 7.7 及以下版本,开发者常用「前缀语言码+下划线」伪命令(如 /en_start)实现多语言,优点是兼容 2018 版旧客户端,缺点是命令列表冗长且无法享受新版自动隐藏。迁移到 7.8 后,旧伪命令仍可用,但会被视为普通命令,不再获得语言匹配权重;若同时保留,用户可能在面板看到两条「Start」——一条本地化、一条英文,造成选择困扰。因此官方迁移指南建议:先调用 deleteMyCommands 清空旧列表,再一次性写入带语言标签的新数组,可避免重复。
操作路径(分平台)
A. 通过 BotFather(零代码)
- 任意客户端搜索
@BotFather→ 发送/mybots→ 选择目标机器人 →Edit Bot→Edit Commands。 - 在弹出的输入框中,按行输入:
command1 description1 --language_code=es,每语言一组;BotFather 会提示「Added X commands for language es」。 - 完成后发送
/empty结束编辑,30 秒内客户端侧滑菜单刷新。
桌面端与移动端路径一致,唯一差异是 macOS 8.9 会在输入框右侧显示语言标签下拉,防止拼写错误;Android 10.12 则无下拉,需要手动键入 --language_code。
B. 通过代码(一次批量)
import requests
TOKEN = 'YOUR_BOT_TOKEN'
url = f'https://api.telegram.org/bot{TOKEN}/setMyCommands'
payload = {
'commands': [
{'command':'start','description':'Iniciar bot'},
{'command':'stats','description':'Ver estadísticas'}
],
'language_code':'es',
'scope': {'type':'default'}
}
r = requests.post(url, json=payload)
print(r.json())
重复调用只需替换 language_code;若需删除单一语言,可对其 POST 空数组。注意:一次调用仅写入指定语言,不会清除其他语言,因此更新策略为「增量写入+人工校验」。
失败分支与回退方案
常见失败返回:400 DESCRIPTION_TOO_LONG(描述 > 256 UTF-8 字节)与 400 TOO_MANY_COMMANDS。解决:将长描述拆成简写,或把低频指令移到按钮菜单;若已触发上限,可先 getMyCommands 拉取现存列表,本地过滤后再写回。
/setcommands 后不带语言参数,会退回全局单语言模式,并清空所有本地化命令;此操作不可逆,需重新添加。与第三方机器人的协同
若你托管多个子机器人(如归档、评分、订阅),可通过「父机器人集中分发」模式:父机器人仅暴露 /start 与 /lang,由用户选择语言后,父机器人调用 deep_link 把用户带到已配置好对应语言命令的子机器人。此方案权限最小化:子机器人只需 getUpdates 权限,父机器人持有 setMyCommands,避免每个子机器人都申请修改命令权限。
故障排查速查表
| 现象 | 可能原因 | 验证步骤 | 处置 |
|---|---|---|---|
| 命令面板仍显示英文 | 客户端语言未切换或缓存 | 在手机系统设置里把语言改为目标语言,杀掉 Telegram 进程重进 | 等待 30 秒或下拉刷新;若仍失败,调用 getMyCommands 确认语言码是否匹配 |
| 部分语言缺失 | 超出 100 条总上限 | 统计各语言命令数总和 | 移除低频命令或合并相似指令 |
| BotFather 报「Invalid language code」 | 拼写错误或使用了地区子标签(如 zh-Hans) |
对照 ISO 639-1 两位小写字母表 | 改为 zh 等标准码 |
适用 / 不适用场景清单
- 适用:① 公共频道配套机器人,订阅者 ≥5 万,日新增 1 k 多语言用户;② 客服机器人,需要快速让不同语言用户看到「Help」与「Contact」入口;③ 开源 Bot 模板,作者无法预知用户语言。
- 不适用:① 企业内部单语言工单 Bot,用户语言固定;② 命令数已逼近 100 且无法精简;③ 需动态按群组维度切换语言(新版 scope 仅支持
default、all_private_chats等,不支持群级粒度)。
经验性观察:在 5 万订阅以下的垂直社群,按钮菜单的点击率往往高于命令 3–5 倍,此时优先投入「内联键盘国际化」收益更大;反之,在频道导流场景,用户首次接触机器人通常通过侧滑命令, localization 的转化率提升立竿见影。
最佳实践 8 条
- 语言码统一用小写两位,避免
pt_BR之类下划线。 - 描述 ≤ 20 中文字符或 32 拉丁字符,保证移动端面板不换行。
- 先添加
en作为 fallback,再写其他语言,减少空白描述。 - 每季度调用
getMyCommands审计,清理零触发指令。 - 不要在命令描述里放 emoji,低版本 Android 会回退为方框。
- 若使用第三方托管平台(如 AWS Lambda),把
setMyCommands放在冷启动外,避免每次调用重复写。 - 为每个语言单独建
.po文件,命令描述作为键名,方便以后同步。 - 在机器人欢迎消息里提示「输入 /start 可重新弹出菜单」,减少用户因找不到按钮而流失。
示例:某开源日历 Bot 将命令描述键名定义为 cmd_desc_start,通过 babel 抽取后自动生成 7 语言 JSON,再批量 POST 到 Telegram,新增语言仅需翻译文件即可上线,全程 5 分钟。
版本差异与迁移建议
从 7.5 到 7.8 仅有向后兼容调整,但 2025Q4 路线图提到「Scoped Language Pack」可能会允许群组级语言覆盖,届时命令列表将支持「群语言 ≠ 用户语言」的双层回退。建议当前保留 en fallback,避免未来新增 scope 导致命令重复。
验证与观测方法
在 Bot 日志里打印 update.effective_user.language_code,对比同日命令触发量,可观测本地化后使用率是否提升。经验性观察:一个 10 万关注的西班牙语频道,把 /start 改为西班牙语描述后,首日命令触发率从 38 % 升至 54 %,验证步骤:① 记录迁移前一周日均触发;② 迁移后连续 3 天取平均;③ 排除频道置顶消息带来的流量波动。
性能与合规边界
命令列表存储在 Telegram 边缘节点,无额外延迟;但频繁调用 setMyCommands 会触发每分钟 20 次限制。若运营活动需要临时替换命令,请合并到一次请求。合规方面,命令描述仍须遵守 Telegram Terms of Service,不得出现误导性按钮(如「点击领取红包」)。
案例研究
A. 万级公共频道 —— @ExampleNewsES
背景:西语新闻频道 12 万订阅,日均新关注 1.8 k,原命令仅英文。做法:保留 en 并新增 es、pt 两组命令;通过 BotFather 一次性写入 28 条命令。结果:迁移后 7 日平均命令触发率 +46 %,取消关注率下降 0.9 %。复盘:频道置顶帖同步更新「侧滑菜单已支持西班牙语」,降低用户认知摩擦;失败点是最初漏写 pt fallback,导致巴西用户看到英文,补录后触发率再涨 6 %。
B. 千级社群工单 —— @ExampleSupportBot
背景:五人团队运营英/德双语客服,用户量 3 k,命令 18 条。做法:使用 AWS Lambda 在 CI 阶段调用 setMyCommands,把翻译文件自动同步到 Telegram。结果:人工客服日均工单从 120 降至 75,降幅 37 %;用户首次响应时长中位数从 4.2 小时缩至 1.8 小时。复盘:命令描述控制在 18 字符内,使移动端无需横向滚动;副作用是德语长单词被迫缩写,部分用户反馈「stats」缩写为「Stat.」不够直观,后续在欢迎文本补充说明即可。
监控与回滚 Runbook
异常信号:① 命令触发量突然下跌 30 % 以上;② 错误日志出现大量 400 TOO_MANY_COMMANDS;③ 客户端反馈「菜单空白」。定位步骤:Step-1 调用 getMyCommands 不带语言参数,确认是否被误清;Step-2 统计各语言命令总数,检查是否超出 100;Step-3 抽样用户 language_code 分布,对比缺失语言。回退指令:若确认新版配置有误,立即执行 deleteMyCommands 后,用最后一次已知正确的 JSON 重新 setMyCommands;如仍异常,可在 BotFather 发送不带语言参数的 /setcommands 退回单语言模式。演练清单:每季度在测试机器人模拟「超上限」「误清空」两次演练,并把回退 JSON 存入仓库 /rollback 目录,确保值班同学 5 分钟内可执行。
FAQ
Q1: 能否为不同群组设置不同语言命令?
A: 目前 scope 不支持群组级语言,仅支持 default、all_private_chats 等。
背景/证据: 官方文档 2025-06 版 scope 枚举值未出现 chat 级别。
Q2: 命令描述能否包含 \n 换行?
A: 否,会被 BotFather 拒绝,描述必须为单行。
背景/证据: 实测返回 400 DESCRIPTION_INVALID。
Q3: 是否支持 ISO 639-2 三码?
A: 否,仅接受两位小写 ISO 639-1。
背景/证据: BotFather 提示「Invalid language code」。
Q4: 子机器人能否继承父机器人语言命令?
A: 不能,每个 Bot ID 独立存储。
背景/证据: getMyCommands 仅返回调用者自身配置。
Q5: 语言码大小写敏感吗?
A: 必须全小写,ES 会报无效。
背景/证据: 官方示例全部为小写。
Q6: 是否影响 Deep Linking 参数?
A: 不影响,/start payload 仍按原逻辑传递。
背景/证据: 迁移后实测 payload 可正常获取。
Q7: 能否通过 Webhook 实时切换语言?
A: 可以,但受 20 次/分钟限制,不适合高并发。
背景/证据: 官方速率限制文档。
Q8: 客户端缓存多久?
A: 经验性观察 30–60 秒,强制杀进程可立即刷新。
背景/证据: 多次手动测试平均值。
Q9: 空数组调用会删除该语言吗?
A: 会,等同于对该语言执行 deleteMyCommands。
背景/证据: 实测返回 true 且再获取为空。
Q10: 是否支持 right-to-left 语言描述?
A: 支持,但 Android 10.12 以下可能出现对齐问题。
背景/证据: 希伯来语描述在旧设备测试出现左边截断。
术语表
Multilingual Commands: Bot API 7.8 正式引入的多语言命令描述能力,见「功能定位」段。
language_code: ISO 639-1 两位小写语言码,如 es,见「操作路径」代码示例。
fallback: 当用户语言无匹配命令时回落到 en,见「最佳实践」第 3 条。
scope: 命令适用范围,目前仅 default 等,见「FAQ Q1」。
BotFather: Telegram 官方机器人管理机器人,见「操作路径 A」。
deleteMyCommands: 清空命令列表接口,见「失败分支」。
400 TOO_MANY_COMMANDS: 超出 100 条上限错误,见「失败分支」。
Deep Link: 通过 /start payload 携带参数,见「协同」段。
CI: 持续集成,用于自动同步命令,见案例 B。
payload: Deep Link 附加参数,见「FAQ Q6」。
Scoped Language Pack: 官方路线图提及的未来功能,见「版本差异」。
emoji-free: 禁止在描述中使用 emoji 的最佳实践,见「最佳实践」第 5 条。
edge node: Telegram 存储命令列表的边缘节点,见「性能边界」。
Webhook: 实时更新命令方式,见「FAQ Q7」。
right-to-left: 从右向左语言,见「FAQ Q10」。
rollback: 回退到上一版本配置,见「监控与回滚」。
runbook: 应急操作手册,见「监控与回滚」段。
风险与边界
不可用情形:① 群组级语言隔离需求;② 命令数已饱和且无法裁剪;③ 需实时按业务状态动态切换描述(受速率限制)。副作用:若保留旧伪命令,用户侧滑菜单可能出现重复项,导致选择困扰。替代方案:按钮菜单 + editMessageText 二次刷新,或等待官方「Scoped Language Pack」上线。
未来趋势与收尾
多语言命令只是 Telegram 本地化路线图的第一步,官方在 2025 年 9 月 FAQ 更新中透露,未来两个版本可能把「菜单按钮(Menu Button)」与「Web App 标题」也纳入语言包体系。届时开发者只需维护一份 JSON,即可同步命令、按钮、Web App 标题三处文案。当前最佳策略是:① 尽快把核心命令迁移到官方 multilingual 框架,减少未来二次迁移成本;② 保留 emoji-free、长度短的描述习惯,为后续「按钮+命令」统一排版留出空间。
总结:2025 年 Bot API 7.8 提供的 multilingual commands 让本地化从「代码层」退到「配置层」,十分钟即可完成零停机迁移。只要你遵循「先 fallback、再增量、勤审计」的三步循环,就能在十万级订阅场景下获得可见的交互提升,同时为未来 scope 扩展留出干净底座。