Lang
Lib for multi language support
It is important to understand:
- Any bot can be translated
- The bot consists of commands in which there are no untranslated places.
- All commands are multilingual
- There are no commands like
/menuEn
,/menuFr, /menuRu
. There is only one/menu
command - All multilingual texts must be placed in each language files (command), for example, in lng-en, lng-ru. This will make them easier to translate.
- everything can be translated: any text, answer, keyboard, inline keyboard, alert...
This is especially important for large bots
First - need to setup languages. For example with /setup command:
var enLang = {
user: { whatIsYourName: "What is your name?" },
hello: "Hello!",
onlyOnEnglish: "Only on english"
keyboards: {
mainMenu: { buttons: "Bonus, Friends", text: "menu" }
bonusMenu: { buttons: "Get bonus, Back", text: "Get your bonus now" }
}
}
var ruLang = {
user: { whatIsYourName: "Как тебя зовут?" },
hello: "Привет!",
// not translated yet:
// onlyOnEnglish: "Only on english"
keyboards: {
mainMenu: { buttons: "Бонус, Друзья", text: "меню"}
bonusMenu: { buttons: "Получить бонус, Назад", text: "получи бонус"}
}
}
// first language is default language
Libs.Lang.setup("en", enLang); // english is default now
Libs.Lang.setup("ru", ruLang);
Now default language is "english".
You can use lib now (for example, in command
/test
):var lang = Libs.Lang;
// send messages on default language
Bot.sendMessage(lang.t("hello")) // Hello!
Bot.sendMessage(lang.t("user.whatIsYourName")) // What is your name?
Bot.sendMessage(lang.t("onlyOnEnglish")) // "Only on english"
// Default language text always is used
// for non translated keys yet
// send keyboard for Main menu:
Bot.sendKeyboard(
lang.t("keyboards.mainMenu.buttons"),
lang.t("keyboards.mainMenu.text")
)
// or send Bonus menu:
Bot.sendKeyboard(
lang.t("keyboards.bonusMenu.buttons"),
lang.t("keyboards.bonusMenu.text")
)
Libs.Lang.user.setLang("ru")
You can get user language code. For example in /start:
// in /start command
var lang_code = request.from.language_code;
Libs.Lang.user.setLang(lang_code)
var lang = Libs.Lang.user.getLang()
Libs.Lang.default.setLang("en")
var default = Libs.Lang.default.getCurLang()
Tips. Also you can use multi lang command. This is not recommended but sometimes a good solution
In BJS for command /hello:
Bot.runCommand("/hello_" + Libs.Lang.user.getLang())
Also you can use
Libs.Lang.t("translation-key", "ru")
for non user actions: in webhooks and etc
Sometimes we do not have user object. For example, on income webhooks or with Bot.runAll command and etc. Therefore, we cannot determine the current language.
The following code might be helpful in such cases.
// command /test
// you can pass language code in params
var lng = params;
// or in options with Bot.run(command: "/test", options: {lngCode: "fr"} )
var lng = options.lngCode
// So now:
// lng = "fr"
Bot.sendMessage(
Libs.Lang.t("hello", lng)
) // Привет!
// get all json for default language:
Bot.sendMessage(Libs.Lang.get())
// get all json for "ru":
Bot.sendMessage(Libs.Lang.get("ru"))
You can set aliases for language.
For
/setup
var enLang = {
aliases: {
// Command /start have aliases:
// home, dashboard and /main:
"home, dashboard, /main": "/start",
// command /otherCommand have aliases:
// alias1, alias2
"alias1,alias2": "/otherCommand"
}
user: { whatIsYourName: "What is your name?" },
}
Libs.Lang.setup("en", enLang);
// find multilanguage aliases
var cmd = Libs.Lang.getCommandByAlias(message);
if(cmd){ Bot.run({ command: cmd }) }
// also it is possible define language
// var cmd = Libs.Lang.getCommandByAlias(message, "ru");
// if(cmd){ Bot.run({ command: cmd }) }
For example "lng-en.js", "lng-fr.js" and etc. So it's easier to translate.
In
/setup
you can make something like this:var languages = ["en", "es", "cn", "ru"];
var cmdName;
for(var i in languages){
cmdName = "lng-" + languages[i].code;
Bot.run({ command: cmdName })
}
Bot.sendMessage("Multi Languages - installed");
var enLang = {
command1: {
text: "your text",
// keys
...
}
...
}
command2: {
text: "your text"
// keys,
...
}
// bot menus
menus: {
mainMenu: {
keyboard:
text:
},
helpMenu: {
keyboad:
text:
}
},
// common links
links: {
homePage: "<a href='example.com'>Home page</a>",
},
alert: {
error: "sorry, we have error"
}
...
}
Libs.Lang.setup("en", enLang);
var enLang = {
command1: {
text: "Please confirm",
keyboard: "Yes, Cancel",
// you can also attach Inline keyboard:
inlineKeyboard: {
buttons: [
{title: "google", url: "http://google.com" },
{title: "other command", command: "/othercommand"}
],
text: "Please make a choice."
}
}
//...
}
Libs.Lang.setup("en", enLang);
So in
/command1
you can make:Bot.sendKeyboard(
Libs.Lang.t("command1.keyboard"),
Libs.Lang.t("command1.text"),
)
// send inline keyboard:
Bot.sendInlineKeyboard(
Libs.Lang.t("command1.inlineKeyboard.buttons"),
Libs.Lang.t("command1.inlineKeyboard.text"),
)
Last modified 2yr ago