i18n support added

This commit is contained in:
mercury
2023-04-09 19:40:18 +04:00
parent 06ca54756c
commit d52bb6dab3
4 changed files with 211 additions and 65 deletions
+113 -62
View File
@@ -4,14 +4,16 @@ class Bot
{
public $input;
public function __construct($key)
public function __construct($key, $i18n)
{
$this->key = $key;
$this->api = "https://api.telegram.org/bot$key/";
$this->file = "https://api.telegram.org/file/bot$key/";
$this->clients = '/config/clients.json';
$this->pac = '/config/pac.json';
$this->ip = getenv('IP');
$this->key = $key;
$this->api = "https://api.telegram.org/bot$key/";
$this->file = "https://api.telegram.org/file/bot$key/";
$this->clients = '/config/clients.json';
$this->pac = '/config/pac.json';
$this->ip = getenv('IP');
$this->i18n = $i18n;
$this->language = $this->getPacConf()['language'] ?: 'en';
}
public function input()
@@ -114,6 +116,7 @@ class Bot
case preg_match('~^/menu (?P<type>adguard)$~', $this->input['callback'], $m):
case preg_match('~^/menu (?P<type>config)$~', $this->input['callback'], $m):
case preg_match('~^/menu (?P<type>ss)$~', $this->input['callback'], $m):
case preg_match('~^/menu (?P<type>lang)$~', $this->input['callback'], $m):
case preg_match('~^/menu (?P<type>subzoneslist|reverselist|includelist|excludelist) (?P<arg>(?:-)?\d+)$~', $this->input['callback'], $m):
$this->menu(type: $m['type'] ?? false, arg: $m['arg'] ?? false);
break;
@@ -153,6 +156,9 @@ class Bot
case preg_match('~^/setSSL (\w+)$~', $this->input['callback'], $m):
$this->setSSL($m[1]);
break;
case preg_match('~^/lang (\w+)$~', $this->input['callback'], $m):
$this->setLang($m[1]);
break;
case preg_match('~^/deletessl$~', $this->input['callback'], $m):
$this->deleteSSL();
break;
@@ -234,6 +240,14 @@ class Bot
}
}
public function setLang($lang)
{
$conf = $this->getPacConf();
$this->language = $conf['language'] = $lang;
$this->setPacConf($conf);
$this->menu('config');
}
public function checkurl()
{
$r = $this->send(
@@ -1117,7 +1131,7 @@ DNS-over-HTTPS with IP:
'callback_data' => "/reset",
],
[
'text' => "back",
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
],
@@ -1151,7 +1165,7 @@ DNS-over-HTTPS with IP:
$data = [
[
[
'text' => "back",
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
],
@@ -1206,11 +1220,11 @@ DNS-over-HTTPS with IP:
$text = "Menu -> Wireguard\n\n<code>" . implode(PHP_EOL, $text) . '</code>';
$data = [
[[
'text' => "update status",
'text' => $this->i18n('update status'),
'callback_data' => "/menu wg 0",
]],
[[
'text' => "add peer",
'text' => $this->i18n('add peer'),
'callback_data' => "/menu addpeer $page",
]],
];
@@ -1218,7 +1232,7 @@ DNS-over-HTTPS with IP:
$data = array_merge($data, $clients);
}
$data[] = [[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu",
]];
return [
@@ -1238,29 +1252,29 @@ DNS-over-HTTPS with IP:
'data' => [
[
[
'text' => "rename",
'text' => $this->i18n('rename'),
'callback_data' => "/rename {$client}_$page",
],
],
[
[
'text' => "show QR",
'text' => $this->i18n('show QR'),
'callback_data' => "/qr $client",
],
[
'text' => "download config",
'text' => $this->i18n('download config'),
'callback_data' => "/download $client",
],
],
[
[
'text' => "delete",
'text' => $this->i18n('delete'),
'callback_data' => "/delete {$client}_$page",
],
],
[
[
'text' => "back",
'text' => $this->i18n('back'),
'callback_data' => "/menu wg $page",
],
],
@@ -1335,9 +1349,9 @@ DNS-over-HTTPS with IP:
<code>RU blacklist:</code> <code>https://github.com/zapret-info/z-i</code>
self lists - domains that will work through a proxy
{$this->i18n('self list')}{$this->i18n('self list explain')}
reverse lists - domains that will work without a proxy, all others through a proxy
{$this->i18n('reverse list')}{$this->i18n('reverse list explain')}
text;
if ($pac) {
$pac['time'] = date('d.m.Y H:i:s', $pac['mtime']);
@@ -1413,7 +1427,7 @@ DNS-over-HTTPS with IP:
'callback_data' => "/paczapret",
],
[
'text' => 'blacklist exclude',
'text' => $this->i18n('blacklist exclude'),
'callback_data' => "/menu excludelist 0",
],
];
@@ -1427,33 +1441,33 @@ DNS-over-HTTPS with IP:
}
$data[] = [
[
'text' => 'self list',
'text' => $this->i18n('self list'),
'callback_data' => "/menu includelist 0",
],
[
'text' => 'subzones',
'text' => $this->i18n('subzones'),
'callback_data' => "/menu subzoneslist 0",
],
[
'text' => "reverse list",
'text' => $this->i18n('reverse list'),
'callback_data' => "/menu reverselist 0",
],
];
if ($conf['zapret'] || !empty($conf['includelist'])) {
$data[] = [
[
'text' => 'update PAC',
'text' => "{$this->i18n('update')} PAC",
'callback_data' => "/pacupdate",
],
[
'text' => 'check url',
'text' => $this->i18n('check url'),
'callback_data' => "/checkurl",
],
];
}
$data[] = [
[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
];
@@ -1511,7 +1525,7 @@ DNS-over-HTTPS with IP:
}
$data[] = [
[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu pac",
],
];
@@ -1576,7 +1590,7 @@ DNS-over-HTTPS with IP:
$text = "Menu -> ShadowSocks";
$data[] = [
[
'text' => 'change password',
'text' => $this->i18n('change password'),
'callback_data' => "/sspswd",
],
];
@@ -1597,13 +1611,13 @@ DNS-over-HTTPS with IP:
];
$data[] = [
[
'text' => 'show QR',
'text' => $this->i18n('show QR'),
'callback_data' => "/qrSS",
],
];
$data[] = [
[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
];
@@ -1613,45 +1627,50 @@ DNS-over-HTTPS with IP:
];
}
public function i18n(string $menu): string
{
return $this->i18n[$this->language][$menu] ?: 'no translate';
}
public function menu($type = false, $arg = false, $return = false)
{
$menu = [
'main' => [
'text' => "Menu",
'text' => $this->i18n('menu'),
'data' => [
[
[
'text' => "Wireguard",
'text' => $this->i18n('wg_title'),
'callback_data' => "/menu wg 0",
],
[
'text' => "Shadowsocks",
'text' => $this->i18n('sh_title'),
'callback_data' => "/menu ss",
],
],
[
[
'text' => "Adguard",
'text' => $this->i18n('ad_title'),
'callback_data' => "/menu adguard",
],
[
'text' => "PAC",
'text' => $this->i18n('pac'),
'callback_data' => "/menu pac",
],
],
[
[
'text' => "config",
'text' => $this->i18n('config'),
'callback_data' => "/menu config",
]
],
[
[
'text' => 'discussion group',
'text' => $this->i18n('chat'),
'url' => "https://t.me/vpnbot_group",
],
[
'text' => 'donate for a new laptop',
'text' => $this->i18n('donate'),
'url' => "https://yoomoney.ru/to/410011827900450",
],
]
@@ -1663,19 +1682,19 @@ DNS-over-HTTPS with IP:
'text' => "Menu -> Wireguard -> Add peer\n\n",
'data' => [
[[
'text' => "all traffic",
'text' => $this->i18n('all traffic'),
'callback_data' => "/add",
]],
[[
'text' => "subnet",
'text' => $this->i18n('subnet'),
'callback_data' => "/add_ips",
]],
[[
'text' => "proxy ip",
'text' => $this->i18n('proxy ip'),
'callback_data' => "/proxy",
]],
[[
'text' => "back",
'text' => $this->i18n('back'),
'callback_data' => "/menu wg $arg",
]],
],
@@ -1688,6 +1707,7 @@ DNS-over-HTTPS with IP:
'subzoneslist' => $type == 'subzoneslist' ? $this->pacList($type, $arg) : false,
'config' => $type == 'config' ? $this->configMenu() : false,
'ss' => $type == 'ss' ? $this->menuSS() : false,
'lang' => $type == 'lang' ? $this->menuLang() : false,
];
$text = $menu[$type ?: 'main' ]['text'];
@@ -1721,7 +1741,7 @@ DNS-over-HTTPS with IP:
$domain = $conf['domain'] ?: $ip;
$scheme = empty($ssl = $this->nginxGetTypeCert()) ? 'http' : 'https';
$text = "Menu -> Adguard Home\n\nDNS server:\n<code>$ip</code>\n\n";
$text = "";
if ($ssl) {
$text .= "DNS over HTTPS:\n<code>$ip</code>\n<code>$scheme://$domain/dns-query</code>\n\n";
$text .= "DNS over TLS:\n<code>$ip:853</code>";
@@ -1729,22 +1749,22 @@ DNS-over-HTTPS with IP:
$data = [
[
[
'text' => 'Adguard Home',
'text' => $this->i18n('adguard web'),
'url' => "$scheme://$domain/adguard",
],
[
'text' => 'change password',
'text' => $this->i18n('change password'),
'callback_data' => "/adguardpsswd",
],
[
'text' => 'reset settings',
'text' => $this->i18n('reset settings'),
'callback_data' => "/adguardreset",
],
],
];
$data[] = [
[
'text' => 'add upstream',
'text' => $this->i18n('add upstream'),
'callback_data' => "/addupstream",
],
];
@@ -1757,7 +1777,7 @@ DNS-over-HTTPS with IP:
'callback_data' => "/menu adguard",
],
[
'text' => 'delete',
'text' => $this->i18n('delete'),
'callback_data' => "/delupstream $k",
],
];
@@ -1765,13 +1785,13 @@ DNS-over-HTTPS with IP:
}
$data[] = [
[
'text' => 'check DNS',
'text' => $this->i18n('check DNS'),
'callback_data' => "/checkdns",
],
];
$data[] = [
[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
];
@@ -1781,14 +1801,39 @@ DNS-over-HTTPS with IP:
];
}
public function menuLang()
{
$data = [];
foreach ($this->i18n as $k => $v) {
if ($k != $this->language) {
$data[] = [
[
'text' => $k,
'callback_data' => "/lang $k",
],
];
}
}
$data[] = [
[
'text' => $this->i18n('back'),
'callback_data' => "/menu config",
],
];
return [
'text' => 'Language',
'data' => $data,
];
}
public function configMenu()
{
$conf = $this->getPacConf();
$text = "Menu -> Config\n\nSome clients require a valid certificate when connecting, such as windows 11 DoH or ShadowSocks Android (PAC url), this requires a domain";
$text = $this->i18n('domain explain');
$data = [
[
[
'text' => $conf['domain'] ? "delete {$conf['domain']}" : 'install domain',
'text' => $conf['domain'] ? "{$this->i18n('delete')} {$conf['domain']}" : $this->i18n('install domain'),
'callback_data' => $conf['domain'] ? '/deldomain' : '/domain',
],
],
@@ -1799,11 +1844,11 @@ DNS-over-HTTPS with IP:
case 'letsencrypt':
$data[] = [
[
'text' => 'renew SSL',
'text' => $this->i18n('renew SSL'),
'callback_data' => "/setSSL letsencrypt",
],
[
'text' => 'delete SSL',
'text' => $this->i18n('delete SSL'),
'callback_data' => "/deletessl",
],
];
@@ -1811,7 +1856,7 @@ DNS-over-HTTPS with IP:
case 'self':
$data[] = [
[
'text' => 'delete SSL',
'text' => $this->i18n('delete SSL'),
'callback_data' => "/deletessl",
],
];
@@ -1820,11 +1865,11 @@ DNS-over-HTTPS with IP:
} else {
$data[] = [
[
'text' => 'Letsencrypt SSL',
'text' => $this->i18n('Letsencrypt SSL'),
'callback_data' => "/setSSL letsencrypt",
],
[
'text' => 'Self SSL',
'text' => $this->i18n('Self SSL'),
'callback_data' => "/selfssl",
],
];
@@ -1832,7 +1877,7 @@ DNS-over-HTTPS with IP:
}
$data[] = [
[
'text' => 'add admin',
'text' => "{$this->i18n('add')} {$this->i18n('admin')}",
'callback_data' => "/addadmin",
],
];
@@ -1842,26 +1887,32 @@ DNS-over-HTTPS with IP:
foreach ($c['admin'] as $k => $v) {
$data[] = [
[
'text' => "delete $v",
'text' => $this->i18n('delete') . " $v",
'callback_data' => "/deladmin $v",
],
];
}
$data[] = [
[
'text' => 'import',
'text' => $this->i18n('lang'),
'callback_data' => "/menu lang",
],
];
$data[] = [
[
'text' => $this->i18n('import'),
'callback_data' => "/import",
],
];
$data[] = [
[
'text' => 'export',
'text' => $this->i18n('export'),
'callback_data' => "/export",
],
];
$data[] = [
[
'text' => 'back',
'text' => $this->i18n('back'),
'callback_data' => "/menu",
],
];
+93
View File
@@ -0,0 +1,93 @@
<?php
$i = [
'en' => [
'wg_title' => 'Wireguard',
'sh_title' => 'Shadowsocks',
'ad_title' => 'AdGuard',
'config' => 'config',
'pac' => 'PAC',
'chat' => 'discussion group',
'back' => 'back',
'import' => 'import',
'export' => 'export',
'delete' => 'delete',
'add' => 'add',
'donate' => 'donate',
'admin' => 'admin',
'menu' => 'Menu',
'update status' => 'update status',
'add peer' => 'add peer',
'all traffic' => 'all traffic',
'subnet' => 'subnet',
'proxy ip' => 'proxy ip',
'rename' => 'rename',
'show QR' => 'show QR',
'download config' => 'download config',
'install domain' => 'install domain',
'renew SSL' => 'renew SSL',
'delete SSL' => 'delete SSL',
'Letsencrypt SSL' => 'Letsencrypt SSL',
'Self SSL' => 'Self SSL',
'change password' => 'change password',
'reset settings' => 'reset settings',
'add upstream' => 'add upstream',
'check DNS' => 'check DNS',
'update' => 'update',
'self list' => 'self list',
'reverse list' => 'reverse list',
'subzones' => 'subzones',
'check url' => 'check url',
'blacklist exclude' => 'blacklist exclude',
'lang' => 'language',
'adguard web' => 'web interface',
'domain explain' => 'Some clients require a valid certificate when connecting, such as windows 11 DoH or ShadowSocks Android (PAC url), this requires a domain',
'self list explain' => ' - domains that will work through a proxy',
'reverse list explain' => ' - domains that will work without a proxy, all others through a proxy',
],
'ru' => [
'wg_title' => 'Wireguard',
'sh_title' => 'Shadowsocks',
'ad_title' => 'AdGuard',
'config' => 'настройки',
'pac' => 'PAC',
'chat' => 'чат поддержки',
'back' => 'назад',
'import' => 'импорт',
'export' => 'экспорт',
'delete' => 'удалить',
'add' => 'добавить',
'donate' => 'донат',
'admin' => 'админа',
'menu' => 'Меню',
'update status' => 'обновить статус',
'add peer' => 'добавить клиента',
'all traffic' => 'весь трафик',
'subnet' => 'подсеть',
'proxy ip' => 'айпи прокси',
'rename' => 'переименовать',
'show QR' => 'показать QR',
'download config' => 'скачать настройки',
'install domain' => 'установить домен',
'renew SSL' => 'обновить SSL',
'delete SSL' => 'удалить SSL',
'Letsencrypt SSL' => 'Letsencrypt SSL',
'Self SSL' => 'Собственный SSL',
'change password' => 'изменить пароль',
'reset settings' => 'сбросить настройки',
'add upstream' => 'добавить DNS',
'check DNS' => 'проверить DNS',
'update' => 'обновить',
'self list' => 'собственный список',
'reverse list' => 'обратный список',
'subzones' => 'поддомены',
'check url' => 'проверить домен',
'lang' => 'язык',
'blacklist exclude' => 'список исключений из блэклиста',
'adguard web' => 'вебморда адгварда',
'domain explain' => 'Некоторым клиентам требуется валидный сертификат при подключении, например Windows 11 DoH или ShadowSocks Android (URL-адрес PAC), для этого требуется домен',
'self list explain' => ' - домены, которые будут работать через прокси',
'reverse list explain' => ' - домены которые будут работать без прокси, все остальные через прокси',
],
];
+2 -1
View File
@@ -7,7 +7,8 @@ require __DIR__ . '/config.php';
if ('POST' == $_SERVER['REQUEST_METHOD'] && $_GET['k'] == $c['key']) {
// require __DIR__ . '/debug.php';
require __DIR__ . '/bot.php';
$bot = new Bot($c['key']);
require __DIR__ . '/i18n.php';
$bot = new Bot($c['key'], $i);
$bot->input();
exit;
}
+3 -2
View File
@@ -3,8 +3,9 @@
// require __DIR__ . '/debug.php';
require __DIR__ . '/bot.php';
require __DIR__ . '/config.php';
require __DIR__ . '/i18n.php';
$bot = new Bot($c['key']);
$bot->setwebhook($c['key']);
$bot = new Bot($c['key'], $i);
$bot->setwebhook();
$bot->setcommands();
$bot->syncPortClients();