diff --git a/plugins/alipay/index.js b/plugins/alipay/index.js
index 7f283351f..7b2726945 100644
--- a/plugins/alipay/index.js
+++ b/plugins/alipay/index.js
@@ -329,7 +329,7 @@ const getUserFinishOrder = async userId => {
orders = orders.map(order => {
return {
orderId: order.orderId,
- type: '支付宝',
+ type: 'Alipay',
amount: order.amount,
createTime: order.createTime,
};
diff --git a/plugins/flowSaver/flow.js b/plugins/flowSaver/flow.js
index c0258f8b7..7625fca1f 100644
--- a/plugins/flowSaver/flow.js
+++ b/plugins/flowSaver/flow.js
@@ -362,7 +362,7 @@ const getServerPortFlow = async (serverId, accountId, timeArray, isMultiServerFl
};
/**
- * 为流量倍率而增加
+ * 为Скорость потока而增加
*/
const getServerPortFlowWithScale = async (serverId, accountId, timeArray, isMultiServerFlow) => {
const serverIdFilter = {};
diff --git a/plugins/freeAccount/views/index.html b/plugins/freeAccount/views/index.html
index 6d1be5fad..f794b1203 100644
--- a/plugins/freeAccount/views/index.html
+++ b/plugins/freeAccount/views/index.html
@@ -40,14 +40,14 @@
@@ -83,7 +83,7 @@
document.getElementById('qrcode').innerHTML = qr.createImgTag(6);
$('.address').text(window.ssqrcode);
$('#qrcode').attr('href', window.ssqrcode);
- $('.time').text('更新时间: ' + (new Date(data.updateTime)).toLocaleString());
+ $('.time').text('Время обновления: ' + (new Date(data.updateTime)).toLocaleString());
});
});
};
diff --git a/plugins/group/db/group.js b/plugins/group/db/group.js
index 9ff0a2e5a..65840b3d2 100644
--- a/plugins/group/db/group.js
+++ b/plugins/group/db/group.js
@@ -7,7 +7,7 @@ const addDefaultGroup = async () => {
.then(s => s[0]);
if (!data) {
const id = await knex('group').insert(
- { id: 0, name: '默认组', comment: '系统默认分组' },
+ { id: 0, name: 'Группа по умолчанию', comment: 'Системная группа по умолчанию' },
);
if (id[0] !== 0) {
await knex('group')
diff --git a/plugins/webgui/public/controllers/admin.js b/plugins/webgui/public/controllers/admin.js
index edb4eb17b..f8ce3dda1 100644
--- a/plugins/webgui/public/controllers/admin.js
+++ b/plugins/webgui/public/controllers/admin.js
@@ -26,35 +26,35 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
}
};
$scope.menus = [{
- name: '首页',
+ name: 'Главная страница',
icon: 'home',
click: 'admin.index',
}, {
- name: '服务器',
+ name: 'Сервер',
icon: 'cloud',
click: 'admin.server',
hide: !!($scope.id !== 1),
}, {
- name: '用户',
+ name: 'Пользователи',
icon: 'people',
click: 'admin.user',
}, {
- name: '账号',
+ name: 'Счета',
icon: 'account_circle',
click: 'admin.account',
}, {
- name: '订单',
+ name: 'Заказы',
icon: 'attach_money',
click: 'admin.pay',
hide: !($scope.config.paypal || $scope.config.giftcard || $scope.config.refCode || $scope.config.alipay),
}, {
- name: '设置',
+ name: 'Настройки',
icon: 'settings',
click: 'admin.settings',
}, {
name: 'divider',
}, {
- name: '退出',
+ name: 'Выйти',
icon: 'exit_to_app',
click: function() {
$http.post('/api/home/logout').then(() => {
@@ -183,7 +183,7 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
])
.controller('AdminIndexController', ['$scope', '$state', 'adminApi', '$localStorage', '$interval', 'orderDialog',
($scope, $state, adminApi, $localStorage, $interval, orderDialog) => {
- $scope.setTitle('首页');
+ $scope.setTitle('Главная страница');
if($localStorage.admin.indexInfo) {
$scope.signupUsers = $localStorage.admin.indexInfo.data.signup;
$scope.loginUsers = $localStorage.admin.indexInfo.data.login;
@@ -245,7 +245,7 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
}
])
.controller('AdminRecentSignupController', ['$scope', '$http', '$state', ($scope, $http, $state) => {
- $scope.setTitle('最新注册用户');
+ $scope.setTitle('Новые зарегистрированные пользователи');
$scope.setMenuButton('arrow_back', 'admin.index');
$scope.recentUsers = null;
$http.get('/api/admin/user/recentSignup?number=100').then(success => {
@@ -256,7 +256,7 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
};
}])
.controller('AdminRecentLoginController', ['$scope', '$http', '$state', ($scope, $http, $state) => {
- $scope.setTitle('最近登录用户');
+ $scope.setTitle('Недавно вошедшие пользователи');
$scope.setMenuButton('arrow_back', 'admin.index');
$scope.recentUsers = null;
$http.get('/api/admin/user/recentLogin?number=-1').then(success => {
@@ -267,7 +267,7 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
};
}])
.controller('AdminTopFlowController', ['$scope', '$http', '$state', ($scope, $http, $state) => {
- $scope.setTitle('今日流量排行');
+ $scope.setTitle('Рейтинг трафика на сегодняшний день');
$scope.setMenuButton('arrow_back', 'admin.index');
$scope.topUsers = null;
$scope.allFlow = 0;
@@ -287,7 +287,7 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
}])
.controller('AdminPayController', ['$scope', 'adminApi', 'orderDialog', '$mdMedia', '$localStorage', 'orderFilterDialog', '$timeout', '$state', '$stateParams',
($scope, adminApi, orderDialog, $mdMedia, $localStorage, orderFilterDialog, $timeout, $state, $stateParams) => {
- $scope.setTitle('订单');
+ $scope.setTitle('Заказ');
$scope.setMenuSearchButton('search');
$scope.showOrderInfo = order => {
orderDialog.show(order);
@@ -295,10 +295,10 @@ app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state',
$scope.myPayType = '';
let tabSwitchTime = 0;
$scope.payTypes = [];
- if($scope.config.alipay) { $scope.payTypes.push({ name: '支付宝' }); }
+ if($scope.config.alipay) { $scope.payTypes.push({ name: 'Alipay' }); }
if($scope.config.paypal) { $scope.payTypes.push({ name: 'Paypal' }); }
- if($scope.config.giftcard) { $scope.payTypes.push({ name: '充值码' }); }
- if($scope.config.refCode) { $scope.payTypes.push({ name: '邀请码' }); }
+ if($scope.config.giftcard) { $scope.payTypes.push({ name: 'Код пополнения' }); }
+ if($scope.config.refCode) { $scope.payTypes.push({ name: 'Код приглашения' }); }
if($scope.payTypes.length) {
$scope.myPayType = $stateParams.myPayType || $scope.payTypes[0].name;
$scope.defaultTabIndex = 0;
diff --git a/plugins/webgui/public/controllers/adminAccount.js b/plugins/webgui/public/controllers/adminAccount.js
index 060378697..4613073a1 100644
--- a/plugins/webgui/public/controllers/adminAccount.js
+++ b/plugins/webgui/public/controllers/adminAccount.js
@@ -2,7 +2,7 @@ const app = angular.module('app');
app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http', 'accountSortDialog','$timeout', 'adminApi', '$localStorage',
($scope, $state, $mdMedia, $http, accountSortDialog, $timeout, adminApi, $localStorage) => {
- $scope.setTitle('账号');
+ $scope.setTitle('счет');
$scope.setMenuRightButton('sort_by_alpha');
$scope.setMenuSearchButton('search');
if(!$localStorage.admin.accountFilterSettings) {
@@ -125,7 +125,7 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
])
.controller('AdminAccountPageController', ['$scope', '$state', '$stateParams', '$http', '$mdMedia', '$q', 'adminApi', '$timeout', '$interval', 'qrcodeDialog', 'ipDialog', '$mdBottomSheet', 'wireGuardConfigDialog', '$filter', 'subscribeDialog',
($scope, $state, $stateParams, $http, $mdMedia, $q, adminApi, $timeout, $interval, qrcodeDialog, ipDialog, $mdBottomSheet, wireGuardConfigDialog, $filter, subscribeDialog) => {
- $scope.setTitle('账号');
+ $scope.setTitle('счет');
$scope.setMenuButton('arrow_back', 'admin.account');
$scope.accountId = +$stateParams.accountId;
$scope.account = { port: '...' };
@@ -428,7 +428,7 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
});
};
$scope.clipboardSuccess = event => {
- $scope.toast($filter('translate')('二维码链接已复制到剪贴板'));
+ $scope.toast($filter('translate')('Ссылка на QR-код скопирована в буфер обмена.'));
};
$scope.isWG = server => server.type === 'WireGuard';
$scope.isSS = server => server.type === 'Shadowsocks';
@@ -443,7 +443,7 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
])
.controller('AdminAddAccountController', ['$scope', '$state', '$http', '$mdBottomSheet', 'alertDialog', '$filter', 'setAccountServerDialog',
($scope, $state, $http, $mdBottomSheet, alertDialog, $filter, setAccountServerDialog) => {
- $scope.setTitle('添加账号');
+ $scope.setTitle('Добавить аккаунт');
$scope.setMenuButton('arrow_back', 'admin.account');
$http.get('/api/admin/order').then(success => {
$scope.orders = success.data.filter(f => !f.baseId);
@@ -459,11 +459,11 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
$scope.account.password = getRandomPassword(10);
});
$scope.typeList = [
- {key: '不限量', value: 1},
- {key: '月', value: 3},
- {key: '周', value: 2},
- {key: '天', value: 4},
- {key: '小时', value: 5},
+ {key: 'Неограниченный', value: 1},
+ {key: 'Месяц', value: 3},
+ {key: 'Неделя', value: 2},
+ {key: 'День', value: 4},
+ {key: 'Час', value: 5},
];
$scope.timeLimit = {
'2': 7 * 24 * 3600000,
@@ -540,10 +540,10 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
server: $scope.account.server,
user: $scope.account.user,
}).then(success => {
- alertDialog.show('添加账号成功', '确定');
+ alertDialog.show('Учетная запись успешно добавлена', 'Конечно');
$state.go('admin.accountPage', { accountId: success.data.id });
}).catch(() => {
- alertDialog.show('添加账号失败', '确定');
+ alertDialog.show('Не удалось добавить аккаунт', 'Конечно');
});
};
$scope.pickTime = () => {
@@ -593,16 +593,16 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
])
.controller('AdminEditAccountController', ['$scope', '$state', '$stateParams', '$http', '$mdBottomSheet', 'confirmDialog', 'alertDialog', '$filter', '$q', 'setAccountServerDialog',
($scope, $state, $stateParams, $http, $mdBottomSheet, confirmDialog, alertDialog, $filter, $q, setAccountServerDialog) => {
- $scope.setTitle('编辑账号');
+ $scope.setTitle('Редактировать аккаунт');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.accountPage', { accountId: $stateParams.accountId });
});
$scope.typeList = [
- {key: '不限量', value: 1},
- {key: '月', value: 3},
- {key: '周', value: 2},
- {key: '天', value: 4},
- {key: '小时', value: 5},
+ {key: 'Неограниченный', value: 1},
+ {key: 'Месяц', value: 3},
+ {key: 'Неделя', value: 2},
+ {key: 'День', value: 4},
+ {key: 'Час', value: 5},
];
$scope.timeLimit = {
'2': 7 * 24 * 3600000,
@@ -721,10 +721,10 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
multiServerFlow: $scope.account.multiServerFlow ? 1 : 0,
server: $scope.account.server,
}).then(success => {
- alertDialog.show('修改账号成功', '确定');
+ alertDialog.show('Успешное изменение учетной записи', 'Конечно');
$state.go('admin.accountPage', { accountId: $stateParams.accountId });
}).catch(() => {
- alertDialog.show('修改账号失败', '确定');
+ alertDialog.show('Не удалось изменить учетную запись.', 'Конечно');
});
};
$scope.pickTime = () => {
@@ -748,10 +748,10 @@ app.controller('AdminAccountController', ['$scope', '$state', '$mdMedia', '$http
};
$scope.deleteAccount = () => {
confirmDialog.show({
- text: '真的要删除账号吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除账号失败',
+ text: 'Вы действительно хотите удалить свой аккаунт? ',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить аккаунт.',
fn: function () { return $http.delete('/api/admin/account/' + accountId); },
}).then(() => {
$state.go('admin.account');
diff --git a/plugins/webgui/public/controllers/adminGiftCard.js b/plugins/webgui/public/controllers/adminGiftCard.js
index 6ed67e9de..b80266661 100644
--- a/plugins/webgui/public/controllers/adminGiftCard.js
+++ b/plugins/webgui/public/controllers/adminGiftCard.js
@@ -2,7 +2,7 @@ const app = angular.module('app');
app.controller('AdminGiftCardController', ['$scope', '$http', 'addGiftCardBatchDialog', '$state',
($scope, $http, addGiftCardBatchDialog, $state) => {
- $scope.setTitle('充值码管理');
+ $scope.setTitle('Управление кодами пополнения');
$scope.setMenuButton('arrow_back', 'admin.settings');
const showBatch = () => {
$http.get('/api/admin/giftcard/list').then(result => {
@@ -28,7 +28,7 @@ app.controller('AdminGiftCardController', ['$scope', '$http', 'addGiftCardBatchD
]).controller('AdminGiftCardBatchDetailsController', ['$scope', '$http', '$stateParams', 'confirmDialog', 'alertDialog',
($scope, $http, $stateParams, confirmDialog, alertDialog) => {
const batchNumber = $stateParams.batchNumber;
- $scope.setTitle(`充值码[ ${batchNumber} ]`);
+ $scope.setTitle(`Код пополнения[ ${batchNumber} ]`);
$scope.setMenuButton('arrow_back', 'admin.listGiftCardBatch');
const showDetails = () => {
$http.get(`/api/admin/giftcard/details/${batchNumber}`).then(result => {
@@ -42,16 +42,16 @@ app.controller('AdminGiftCardController', ['$scope', '$http', 'addGiftCardBatchD
});
};
$scope.showPassword = (id, password) => {
- alertDialog.show(`卡号:${id},密码:${password}`, '确定');
+ alertDialog.show(`номер карты:${id},пароль:${password}`, 'Конечно');
};
showDetails();
$scope.revoke = () => {
confirmDialog.show({
- text: '确实要召回这些卡片吗?该操作不可撤销。',
- cancel: '取消',
- confirm: '召回',
- error: '召回失败',
+ text: 'Вы уверены, что хотите отозвать эти карты? Это действие не может быть отменено. ',
+ cancel: 'Отмена',
+ confirm: 'Отозвать',
+ error: 'Неудачный отзыв',
fn: () => {
return $http.post(`/api/admin/giftcard/revoke`, { batchNumber });
},
diff --git a/plugins/webgui/public/controllers/adminGroup.js b/plugins/webgui/public/controllers/adminGroup.js
index 7d40b8c7a..2b65e054a 100644
--- a/plugins/webgui/public/controllers/adminGroup.js
+++ b/plugins/webgui/public/controllers/adminGroup.js
@@ -2,7 +2,7 @@ const app = angular.module('app');
app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
($scope, $http, $state) => {
- $scope.setTitle('群组管理');
+ $scope.setTitle('Управление группой');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.settings');
});
@@ -16,7 +16,7 @@ app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
}
]).controller('AdminAddGroupController', ['$scope', '$q', '$http', '$state', 'alertDialog', 'setGroupNoticeDialog', 'setGroupOrderDialog',
($scope, $q, $http, $state, alertDialog, setGroupNoticeDialog, setGroupOrderDialog) => {
- $scope.setTitle('新增群组');
+ $scope.setTitle('Добавить новую группу');
$scope.setMenuButton('arrow_back', 'admin.groupSetting');
$scope.group = {};
$q.all([
@@ -104,10 +104,10 @@ app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
}, {
timeout: 15000,
}).then(success => {
- alertDialog.show('添加群组成功', '确定');
+ alertDialog.show('Группа успешно добавлена', 'Конечно');
$state.go('admin.groupSetting');
}).catch(() => {
- alertDialog.show('添加群组失败', '确定');
+ alertDialog.show('Не удалось добавить группу', 'Конечно');
});
};
$scope.cancel = () => {
@@ -122,7 +122,7 @@ app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
}
]).controller('AdminEditGroupController', ['$scope', '$http', '$q', '$state', '$stateParams', 'alertDialog', 'setGroupNoticeDialog', 'setGroupOrderDialog',
($scope, $http, $q, $state, $stateParams, alertDialog, setGroupNoticeDialog, setGroupOrderDialog) => {
- $scope.setTitle('修改群组');
+ $scope.setTitle('Изменить группу');
$scope.setMenuButton('arrow_back', 'admin.groupSetting');
$scope.groupId = +$stateParams.groupId;
$scope.group = {};
@@ -209,10 +209,10 @@ app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
}, {
timeout: 15000,
}).then(success => {
- alertDialog.show('修改群组成功', '确定');
+ alertDialog.show('Группа успешно изменена', 'Конечно');
$state.go('admin.groupSetting');
}).catch(() => {
- alertDialog.show('修改群组失败', '确定');
+ alertDialog.show('Не удалось изменить группу', 'Конечно');
});
};
$scope.cancel = () => {
@@ -223,10 +223,10 @@ app.controller('AdminGroupSettingController', ['$scope', '$http', '$state',
$http.delete(`/api/admin/group/${ $scope.groupId }`, {
timeout: 15000,
}).then(success => {
- alertDialog.show('删除群组成功', '确定');
+ alertDialog.show('Группа успешно удалена', 'Конечно');
$state.go('admin.groupSetting');
}).catch(() => {
- alertDialog.show('删除群组失败', '确定');
+ alertDialog.show('Не удалось удалить группу.', 'Конечно');
});
};
$scope.setGroupNotice = () => {
diff --git a/plugins/webgui/public/controllers/adminNotice.js b/plugins/webgui/public/controllers/adminNotice.js
index 03f003048..925ff5794 100644
--- a/plugins/webgui/public/controllers/adminNotice.js
+++ b/plugins/webgui/public/controllers/adminNotice.js
@@ -1,7 +1,7 @@
const app = angular.module('app');
app.controller('AdminNoticeController', ['$scope', '$http', '$state', ($scope, $http, $state) => {
- $scope.setTitle('公告管理');
+ $scope.setTitle('Управление объявлениями');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.settings');
});
@@ -16,7 +16,7 @@ app.controller('AdminNoticeController', ['$scope', '$http', '$state', ($scope, $
};
}])
.controller('AdminEditNoticeController', ['$scope', '$http', '$state', '$stateParams', 'markdownDialog', 'setNoticeGroupDialog', 'confirmDialog', ($scope, $http, $state, $stateParams, markdownDialog, setNoticeGroupDialog, confirmDialog) => {
- $scope.setTitle('编辑公告');
+ $scope.setTitle('Редакционное объявление');
$scope.setMenuButton('arrow_back', 'admin.notice');
$http.get('/api/admin/notice/' + $stateParams.noticeId).then(success => {
$scope.notice = success.data;
@@ -29,10 +29,10 @@ app.controller('AdminNoticeController', ['$scope', '$http', '$state', ($scope, $
});
$scope.delete = () => {
confirmDialog.show({
- text: '真的要删除公告吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除公告失败',
+ text: 'Вы действительно хотите удалить объявление?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить объявление.',
fn: function () { return $http.delete('/api/admin/notice/' + $stateParams.noticeId); },
}).then(() => {
$state.go('admin.notice');
diff --git a/plugins/webgui/public/controllers/adminOrder.js b/plugins/webgui/public/controllers/adminOrder.js
index 5a97f31fa..4c083c6d0 100644
--- a/plugins/webgui/public/controllers/adminOrder.js
+++ b/plugins/webgui/public/controllers/adminOrder.js
@@ -3,7 +3,7 @@ const app = angular.module('app');
app
.controller('AdminOrderSettingController', ['$scope', '$state', '$http',
($scope, $state, $http, $filter) => {
- $scope.setTitle('订单设置');
+ $scope.setTitle('Настройка заказа');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.settings');
});
@@ -36,14 +36,14 @@ app
])
.controller('AdminNewOrderController', ['$scope', '$state', '$http', '$filter', 'setOrderServerDialog', 'setOrderGroupDialog',
($scope, $state, $http, $filter, setOrderServerDialog, setOrderGroupDialog) => {
- $scope.setTitle('新增订单');
+ $scope.setTitle('Добавить заказ');
$scope.setMenuButton('arrow_back', 'admin.order');
$scope.typeList = [
- { key: '周', value: 2 },
- { key: '月', value: 3 },
- { key: '天', value: 4 },
- { key: '小时', value: 5 },
+ { key: 'Неделя', value: 2 },
+ { key: 'Месяц', value: 3 },
+ { key: 'День', value: 4 },
+ { key: 'Час', value: 5 },
];
$scope.order = {
orderType: 'normal',
@@ -180,7 +180,7 @@ app
])
.controller('AdminEditOrderController', ['$scope', '$state', '$http', '$stateParams', 'confirmDialog', '$filter', '$q', 'setOrderGroupDialog', 'setOrderServerDialog', 'setCurrentAccountDialog',
($scope, $state, $http, $stateParams, confirmDialog, $filter, $q, setOrderGroupDialog, setOrderServerDialog, setCurrentAccountDialog) => {
- $scope.setTitle('编辑订单');
+ $scope.setTitle('Изменить заказ');
$scope.setMenuButton('arrow_back', 'admin.order');
$scope.changeCurrentAccount = {
flow: false,
@@ -188,10 +188,10 @@ app
autoRemove: false,
};
$scope.typeList = [
- {key: '周', value: 2},
- {key: '月', value: 3},
- {key: '天', value: 4},
- {key: '小时', value: 5},
+ {key: 'Неделя', value: 2},
+ {key: 'Месяц', value: 3},
+ {key: 'День', value: 4},
+ {key: 'Час', value: 5},
];
$scope.orderId = $stateParams.id;
@@ -279,21 +279,21 @@ app
$scope.cancel = () => { $state.go('admin.order'); };
$scope.delete = () => {
confirmDialog.show({
- text: '真的要删除此订单吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除订单失败',
+ text: 'Вы действительно хотите удалить этот заказ?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить заказ.',
useFnErrorMessage: true,
fn: function () {
return $http.delete(`/api/admin/order/${ $scope.orderId }`).catch(err => {
if(err.status === 403) {
let errData = '删除订单失败';
- if(err.data === 'account with this order exists') { errData = '无法删除订单,请先删除订单对应的账号'; }
- if(err.data === 'giftcard with this order exists') { errData = '无法删除订单,请先删除订单对应的充值码'; }
- if(err.data === 'flowpack order exists') { errData = '无法删除订单,请先删除对应的流量包订单'; }
+ if(err.data === 'account with this order exists') { errData = 'Невозможно удалить заказ, сначала удалите учетную запись, соответствующую заказу.'; }
+ if(err.data === 'giftcard with this order exists') { errData = 'Невозможно удалить заказ, сначала удалите код пополнения, соответствующий заказу.'; }
+ if(err.data === 'flowpack order exists') { errData = 'Невозможно удалить заказ, сначала удалите соответствующий заказ пакета трафика.'; }
return Promise.reject(errData);
} else {
- return Promise.reject('网络异常,请稍后再试');
+ return Promise.reject('Неисправность сети, попробуйте еще раз позже');
}
});
},
diff --git a/plugins/webgui/public/controllers/adminServer.js b/plugins/webgui/public/controllers/adminServer.js
index 23983c065..f80044840 100644
--- a/plugins/webgui/public/controllers/adminServer.js
+++ b/plugins/webgui/public/controllers/adminServer.js
@@ -2,7 +2,7 @@ const app = angular.module('app');
app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment', '$localStorage', 'adminApi', '$timeout', '$interval', 'serverChartDialog',
($scope, $http, $state, moment, $localStorage, adminApi, $timeout, $interval, serverChartDialog) => {
- $scope.setTitle('服务器');
+ $scope.setTitle('сервер');
$scope.setMenuSearchButton('search');
$scope.setMenuRightButton('timeline');
if(!$localStorage.admin.serverChart) {
@@ -181,7 +181,7 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
])
.controller('AdminServerPageController', ['$scope', '$state', '$stateParams', '$http', 'moment', '$mdDialog', 'adminApi', '$localStorage', '$mdMedia', '$interval', 'banDialog',
($scope, $state, $stateParams, $http, moment, $mdDialog, adminApi, $localStorage, $mdMedia, $interval, banDialog) => {
- $scope.setTitle('服务器');
+ $scope.setTitle('сервер');
$scope.setMenuButton('arrow_back', 'admin.server');
$scope.visiblePortNumber = 60;
const serverId = $stateParams.serverId;
@@ -253,10 +253,10 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
$scope.deleteServer = id => {
const confirm = $mdDialog.confirm()
.title('')
- .textContent('删除服务器?')
+ .textContent('Удалить сервер?')
.ariaLabel('deleteServer')
- .ok('确认')
- .cancel('取消');
+ .ok('Подтвердить')
+ .cancel('Отмена');
$mdDialog.show(confirm).then(() => {
return $http.delete(`/api/admin/server/${ serverId }`);
}).then(() => {
@@ -467,7 +467,7 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
])
.controller('AdminAddServerController', ['$scope', '$state', '$stateParams', '$http', 'alertDialog', '$q',
($scope, $state, $stateParams, $http, alertDialog, $q) => {
- $scope.setTitle('新增服务器');
+ $scope.setTitle('Добавить новые серверы');
$scope.setMenuButton('arrow_back', 'admin.server');
$scope.methods = [
'aes-256-cfb',
@@ -553,10 +553,10 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
tags: $scope.tags,
})
}).then(() => {
- alertDialog.show('添加服务器成功', '确定');
+ alertDialog.show('Сервер успешно добавлен', 'Конечно');
$state.go('admin.server');
}).catch(() => {
- alertDialog.show('添加服务器失败', '确定');
+ alertDialog.show('Не удалось добавить сервер', 'Конечно');
});
};
$scope.cancel = () => {
@@ -566,7 +566,7 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
])
.controller('AdminEditServerController', ['$scope', '$state', '$stateParams', '$http', 'confirmDialog', 'alertDialog', '$q',
($scope, $state, $stateParams, $http, confirmDialog, alertDialog, $q) => {
- $scope.setTitle('编辑服务器');
+ $scope.setTitle('Редактировать сервер');
const serverId = $stateParams.serverId;
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.serverPage', { serverId: $stateParams.serverId });
@@ -689,10 +689,10 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
check: $scope.server.check,
}),
]).then(() => {
- alertDialog.show('修改服务器成功', '确定');
+ alertDialog.show('Сервер успешно изменен', 'Конечно');
$state.go('admin.serverPage', { serverId: $stateParams.serverId });
}).catch(() => {
- alertDialog.show('修改服务器失败', '确定');
+ alertDialog.show('Не удалось изменить сервер', 'Конечно');
});
};
$scope.cancel = () => {
@@ -700,10 +700,10 @@ app.controller('AdminServerController', ['$scope', '$http', '$state', 'moment',
};
$scope.deleteServer = () => {
confirmDialog.show({
- text: '真的要删除服务器吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除服务器失败',
+ text: 'Вы действительно хотите удалить сервер?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить сервер',
fn: function () { return $http.delete('/api/admin/server/' + $stateParams.serverId); },
}).then(() => {
$state.go('admin.server');
diff --git a/plugins/webgui/public/controllers/adminSetting.js b/plugins/webgui/public/controllers/adminSetting.js
index e2f93a2da..cff4972eb 100644
--- a/plugins/webgui/public/controllers/adminSetting.js
+++ b/plugins/webgui/public/controllers/adminSetting.js
@@ -2,40 +2,40 @@ const app = angular.module('app');
app.controller('AdminSettingsController', ['$scope', '$state',
($scope, $state) => {
- $scope.setTitle('设置');
+ $scope.setTitle('Настроить');
$scope.toSetting = path => { $state.go(path); };
if($scope.id === 1) {
$scope.settingList = [
{
- name: '基本设置',
+ name: 'Основные настройки',
to: 'admin.baseSetting',
},
{
- name: '公告管理',
+ name: 'Управление объявлениями',
to: 'admin.notice',
},
{
- name: '群组管理',
+ name: 'Управление группой',
to: 'admin.groupSetting',
},
{
- name: '订单设置',
+ name: 'Настройка заказа',
to: 'admin.order',
},
{
- name: '邮件设置',
+ name: 'Настройки почты',
to: 'admin.mailSetting',
},
{
- name: '账号设置',
+ name: 'Настройки учетной записи',
to: 'admin.accountSetting',
},
{
- name: '修改密码',
+ name: 'Изменить пароль',
to: 'admin.passwordSetting',
},
{
- name: '邀请码',
+ name: 'Код приглашения',
to: 'admin.refSetting',
},
];
@@ -47,18 +47,18 @@ app.controller('AdminSettingsController', ['$scope', '$state',
};
if($scope.config.giftcard) {
$scope.settingList.push({
- name: '充值码',
+ name: 'Код пополнения',
to: 'admin.listGiftCardBatch',
});
};
} else {
$scope.settingList = [
{
- name: '邀请码',
+ name: 'Код приглашения',
to: 'admin.refSetting',
},
{
- name: '修改密码',
+ name: 'Изменить пароль',
to: 'admin.passwordSetting',
},
];
@@ -67,7 +67,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
])
.controller('AdminAccountSettingController', ['$scope', '$http', '$timeout', '$state',
($scope, $http, $timeout, $state) => {
- $scope.setTitle('账号设置');
+ $scope.setTitle('Настройки учетной записи');
$scope.setMenuButton('arrow_back', 'admin.settings');
let lastSave = 0;
let lastSavePromise = null;
@@ -129,7 +129,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminBaseSettingController', ['$scope', '$http', '$timeout', '$state', '$q',
($scope, $http, $timeout, $state, $q) => {
- $scope.setTitle('基本设置');
+ $scope.setTitle('Основные настройки');
$scope.setMenuButton('arrow_back', 'admin.settings');
$scope.baseData = {};
let lastSave = 0;
@@ -253,12 +253,12 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminMailSettingController', ['$scope', '$http', '$timeout', '$state', 'setEmailDialog',
($scope, $http, $timeout, $state, setEmailDialog) => {
- $scope.setTitle('邮件设置');
+ $scope.setTitle('Настройки почты');
$scope.setMenuButton('arrow_back', 'admin.settings');
$scope.mails = [
- { type: 'code', name: '注册验证码' },
- { type: 'reset', name: '密码重置' },
- { type: 'order', name: '订单完成' },
+ { type: 'code', name: 'Код подтверждения регистрации' },
+ { type: 'reset', name: 'Сброс пароля' },
+ { type: 'order', name: 'Заказ выполнен' },
];
$scope.setEmail = type => {
setEmailDialog.show(type);
@@ -266,7 +266,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminPasswordSettingController', ['$scope', '$http', '$timeout', '$state', 'adminApi', 'alertDialog', '$localStorage',
($scope, $http, $timeout, $state, adminApi, alertDialog, $localStorage) => {
- $scope.setTitle('修改密码');
+ $scope.setTitle('Изменить пароль');
$scope.setMenuButton('arrow_back', 'admin.settings');
$scope.data = {
password: '',
@@ -276,7 +276,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
$scope.confirm = () => {
alertDialog.loading();
adminApi.changePassword($scope.data.password, $scope.data.newPassword).then(success => {
- alertDialog.show('修改密码成功,请重新登录', '确定')
+ alertDialog.show('Пароль успешно изменен, пожалуйста, войдите снова', 'Конечно')
.then(() => {
return $http.post('/api/home/logout');
}).then(() => {
@@ -285,13 +285,13 @@ app.controller('AdminSettingsController', ['$scope', '$state',
$state.go('home.index');
});
}).catch(err => {
- alertDialog.show('修改密码失败', '确定');
+ alertDialog.show('Смена пароля не удалась', 'Конечно');
});
};
}
]).controller('AdminTelegramSettingController', ['$scope', '$http', '$interval', '$state',
($scope, $http, $interval, $state) => {
- $scope.setTitle('绑定Telegram');
+ $scope.setTitle('Ссылка на Телеграмм');
$scope.setMenuButton('arrow_back', 'admin.settings');
$scope.isLoading = true;
$scope.code = {};
@@ -312,26 +312,26 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminPaymentListController', ['$scope', '$http', '$state',
($scope, $http, $state) => {
- $scope.setTitle('支付设置');
+ $scope.setTitle('Настройки оплаты');
$scope.setMenuButton('arrow_back', 'admin.settings');
$scope.time = [{
id: 'hour',
- name: '小时',
+ name: 'Час',
}, {
id: 'day',
- name: '天',
+ name: 'День',
}, {
id: 'week',
- name: '周',
+ name: 'Неделя',
}, {
id: 'month',
- name: '月',
+ name: 'Месяц',
}, {
id: 'season',
- name: '季',
+ name: 'Квартал',
}, {
id: 'year',
- name: '年',
+ name: 'Год',
}];
$scope.editPayment = id => {
$state.go('admin.editPayment', { paymentType: id });
@@ -342,23 +342,23 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminEditPaymentController', ['$scope', '$http', '$timeout', '$interval', '$state', '$stateParams',
($scope, $http, $timeout, $interval, $state, $stateParams) => {
- $scope.setTitle('修改支付');
+ $scope.setTitle('Изменить платеж');
$scope.setMenuButton('arrow_back', 'admin.paymentList');
$scope.paymentType = $stateParams.paymentType;
$scope.paymentTypeName = type => {
switch(type) {
case 'hour':
- return '小时'; break;
+ return 'Час'; break;
case 'day':
- return '天'; break;
+ return 'День'; break;
case 'week':
- return '周'; break;
+ return 'Неделя'; break;
case 'month':
- return '月'; break;
+ return 'Месяц'; break;
case 'season':
- return '季'; break;
+ return 'Квартал'; break;
case 'year':
- return '年'; break;
+ return 'Год'; break;
default:
return '';
}
@@ -416,7 +416,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminRefSettingController', ['$scope', '$http', '$timeout', '$state',
($scope, $http, $timeout, $state) => {
- $scope.setTitle('邀请码管理');
+ $scope.setTitle('Управление кодом приглашения');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.settings');
});
@@ -458,7 +458,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminRefCodeListController', ['$scope', '$http', '$timeout', '$state', '$mdMedia',
($scope, $http, $timeout, $state, $mdMedia) => {
- $scope.setTitle('邀请码列表');
+ $scope.setTitle('Список кодов приглашений');
$scope.setMenuSearchButton('search');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.refSetting');
@@ -539,7 +539,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
}
]).controller('AdminEditRefCodeController', ['$scope', '$http', '$timeout', '$state', '$filter', '$stateParams',
($scope, $http, $timeout, $state, $filter, $stateParams) => {
- $scope.setTitle('编辑邀请码');
+ $scope.setTitle('Изменить код приглашения');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.refCodeList');
});
@@ -571,12 +571,12 @@ app.controller('AdminSettingsController', ['$scope', '$state',
});
$scope.getRefUrl = code => `${ $scope.config.site }/home/ref/${ code }`;
$scope.clipboardSuccess = event => {
- $scope.toast($filter('translate')('邀请链接已复制到剪贴板'));
+ $scope.toast($filter('translate')('Ссылка приглашения скопирована в буфер обмена'));
};
}
]).controller('AdminRefUserListController', ['$scope', '$http', '$timeout', '$state', '$mdMedia',
($scope, $http, $timeout, $state, $mdMedia) => {
- $scope.setTitle('邀请用户列表');
+ $scope.setTitle('Список приглашенных пользователей');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.refSetting');
});
@@ -627,7 +627,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
])
.controller('AdminMyRefCodeController', ['$scope', '$http', '$filter', '$state', '$mdMedia',
($scope, $http, $filter, $state, $mdMedia) => {
- $scope.setTitle('我的邀请码');
+ $scope.setTitle('Мой пригласительный код');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.refSetting');
});
@@ -637,13 +637,13 @@ app.controller('AdminSettingsController', ['$scope', '$state',
return `${ $scope.config.site }/home/ref/${ code }`;
};
$scope.clipboardSuccess = event => {
- $scope.toast($filter('translate')('邀请链接已复制到剪贴板'));
+ $scope.toast($filter('translate')('Ссылка приглашения скопирована в буфер обмена'));
};
}
])
.controller('AdminAddRefUserController', ['$scope', '$http', '$timeout', '$state', '$mdMedia', 'alertDialog',
($scope, $http, $timeout, $state, $mdMedia, alertDialog) => {
- $scope.setTitle('添加邀请关系');
+ $scope.setTitle('Добавить приглашение');
$scope.setMenuButton('arrow_back', function() {
$state.go('admin.refUserList');
});
@@ -683,7 +683,7 @@ app.controller('AdminSettingsController', ['$scope', '$state',
.then(success => {
$state.go('admin.refUserList');
}).catch(err => {
- alertDialog.show('添加失败', '确定');
+ alertDialog.show('Добавить не удалось', 'Конечно');
});
};
$scope.cancel = () => {
diff --git a/plugins/webgui/public/controllers/adminUser.js b/plugins/webgui/public/controllers/adminUser.js
index 15df28a7b..184671a8f 100644
--- a/plugins/webgui/public/controllers/adminUser.js
+++ b/plugins/webgui/public/controllers/adminUser.js
@@ -2,7 +2,7 @@ const app = angular.module('app');
app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'adminApi', '$mdMedia', '$localStorage', 'userSortDialog', '$timeout',
($scope, $state, $stateParams, adminApi, $mdMedia, $localStorage, userSortDialog, $timeout) => {
- $scope.setTitle('用户');
+ $scope.setTitle('пользователь');
$scope.setMenuSearchButton('search');
$scope.setFabButton(() => {
$state.go('admin.addUser');
@@ -121,7 +121,7 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
])
.controller('AdminUserPageController', ['$scope', '$state', '$stateParams', '$http', 'editUserCommentDialog', 'adminApi', 'orderDialog', 'confirmDialog', 'emailDialog', 'addAccountDialog', 'setGroupDialog',
($scope, $state, $stateParams, $http, editUserCommentDialog, adminApi, orderDialog, confirmDialog, emailDialog, addAccountDialog, setGroupDialog) => {
- $scope.setTitle('用户信息');
+ $scope.setTitle('Информация о пользователе');
$scope.setMenuButton('arrow_back', 'admin.user');
const userId = $stateParams.userId;
$scope.user = { username: '...' };
@@ -148,10 +148,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
getUserData();
$scope.deleteUserAccount = (accountId) => {
confirmDialog.show({
- text: '将此账号移除出该用户的列表?',
- cancel: '取消',
- confirm: '移除',
- error: '移除账号失败',
+ text: 'Удалить эту учетную запись из списка этого пользователя?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить аккаунт',
fn: function () { return $http.delete(`/api/admin/user/${ userId }/${ accountId }`); },
}).then(() => {
getUserData();
@@ -161,10 +161,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
};
$scope.deleteMacAccount = accountId => {
confirmDialog.show({
- text: '删除该账号?',
- cancel: '取消',
- confirm: '删除',
- error: '删除账号失败',
+ text: 'Удалить этот аккаунт?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить аккаунт.',
fn: function () { return $http.delete('/api/admin/account/mac/', {
params: { id: accountId },
}); },
@@ -194,10 +194,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
};
$scope.deleteUser = () => {
confirmDialog.show({
- text: '真的要删除该用户吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除用户失败',
+ text: 'Вы действительно хотите удалить этого пользователя?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить пользователя',
fn: function () {
return $http.delete(`/api/admin/user/${ userId }`);
},
@@ -225,10 +225,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
};
$scope.deleteRefUser = refUserId => {
confirmDialog.show({
- text: '删除该邀请关系?',
- cancel: '取消',
- confirm: '删除',
- error: '删除邀请关系失败',
+ text: 'Удалить это приглашение?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить связь приглашения',
fn: function () { return $http.delete(`/api/admin/ref/${ userId }/${ refUserId }`); },
}).then(() => {
getUserData();
@@ -238,10 +238,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
};
$scope.deleteRefCode = code => {
confirmDialog.show({
- text: '删除该邀请码?\n注意,邀请码对应的邀请关系也会一并删除',
- cancel: '取消',
- confirm: '删除',
- error: '删除邀请码失败',
+ text: 'Удалить этот пригласительный код? \nОбратите внимание, что пригласительная связь, соответствующая коду приглашения, также будет удалена.',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить код приглашения',
fn: function () { return $http.delete(`/api/admin/ref/${ code }`); },
}).then(() => {
getUserData();
@@ -258,7 +258,7 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
])
.controller('AdminAddUserController', ['$scope', '$state', '$stateParams', '$http', 'alertDialog',
($scope, $state, $stateParams, $http, alertDialog) => {
- $scope.setTitle('添加用户');
+ $scope.setTitle('Добавление пользователей');
$scope.setMenuButton('arrow_back', 'admin.user');
$scope.user = { type: 'normal' };
$scope.confirm = () => {
@@ -270,10 +270,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
}, {
timeout: 15000,
}).then(success => {
- alertDialog.show('添加用户成功', '确定');
+ alertDialog.show('Пользователь успешно добавлен', 'Конечно');
$state.go('admin.user');
}).catch(() => {
- alertDialog.show('添加用户失败', '确定');
+ alertDialog.show('Не удалось добавить пользователя.', 'Конечно');
});
};
$scope.cancel = () => {
@@ -283,7 +283,7 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
])
.controller('AdminAdminPageController', ['$scope', '$state', '$stateParams', '$http', 'adminApi', 'setGroupDialog', 'confirmDialog',
($scope, $state, $stateParams, $http, adminApi, setGroupDialog, confirmDialog) => {
- $scope.setTitle('管理员信息');
+ $scope.setTitle('Информация администратора');
$scope.setMenuButton('arrow_back', 'admin.user');
const userId = $stateParams.userId;
$scope.user = { username: '...' };
@@ -299,10 +299,10 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
$scope.deleteUser = () => {
confirmDialog.show({
- text: '真的要删除该用户吗?',
- cancel: '取消',
- confirm: '删除',
- error: '删除用户失败',
+ text: 'Вы действительно хотите удалить этого пользователя?',
+ cancel: 'Отмена',
+ confirm: 'Удалить',
+ error: 'Не удалось удалить пользователя',
fn: function () {
return $http.delete(`/api/admin/user/${ userId }`);
},
@@ -318,7 +318,7 @@ app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'admi
$http.get('/api/admin/group').then(success => {
$scope.groups = success.data;
- $scope.groups.unshift({ id: 0, name: '无分组', comment: '' });
+ $scope.groups.unshift({ id: 0, name: 'Нет группировки', comment: '' });
$scope.groupInfo = {};
$scope.groups.forEach(f => {
$scope.groupInfo[f.id] = { name: f.name, comment: f.comment };
diff --git a/plugins/webgui/public/controllers/app.js b/plugins/webgui/public/controllers/app.js
index b2acd6e0b..7963993fd 100644
--- a/plugins/webgui/public/controllers/app.js
+++ b/plugins/webgui/public/controllers/app.js
@@ -247,7 +247,7 @@ app
});
}
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
$scope.enterKey = key => {
@@ -260,9 +260,9 @@ app
return homeApi.findPassword($scope.user.email);
})
.then(success => {
- alertDialog.show(success, '确定');
+ alertDialog.show(success, 'Конечно');
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
$scope.toSignupPage = () => {
diff --git a/plugins/webgui/public/controllers/home.js b/plugins/webgui/public/controllers/home.js
index d823ea24f..51a62eb8d 100644
--- a/plugins/webgui/public/controllers/home.js
+++ b/plugins/webgui/public/controllers/home.js
@@ -25,15 +25,15 @@ app
}
};
$scope.menus = [{
- name: '首页',
+ name: 'Главная страница',
icon: 'home',
click: 'home.index'
}, {
- name: '登录',
+ name: 'Авторизоваться',
icon: 'cloud',
click: 'home.login'
}, {
- name: '注册',
+ name: 'зарегистрироваться',
icon: 'face',
click: 'home.signup'
}];
@@ -72,7 +72,7 @@ app
$state.go('admin.index');
}
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
$scope.findPassword = () => {
@@ -80,9 +80,9 @@ app
return homeApi.findPassword($scope.user.email);
})
.then(success => {
- alertDialog.show(success, '确定');
+ alertDialog.show(success, 'Конечно');
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
$scope.enterKey = key => {
@@ -105,7 +105,7 @@ app
return homeApi.sendCode($scope.user.email, $scope.home.refId);
})
.then(success => {
- alertDialog.show('验证码已发至邮箱', '确定');
+ alertDialog.show('Код подтверждения был отправлен на ваш адрес электронной почты.', 'Конечно');
$scope.sendCodeTime = 120;
const interval = $interval(() => {
if ($scope.sendCodeTime > 0) {
@@ -116,7 +116,7 @@ app
}
}, 1000);
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
$scope.signup = () => {
@@ -124,7 +124,7 @@ app
return homeApi.userSignup($scope.user.email, $scope.user.code, $scope.user.password, $scope.home.refId);
})
.then(userType => {
- alertDialog.show('用户注册成功', '确定').then(success => {
+ alertDialog.show('Регистрация пользователя прошла успешно', 'Конечно').then(success => {
configManager.deleteConfig();
if(userType === 'admin') {
$state.go('admin.index');
@@ -133,7 +133,7 @@ app
}
});
}).catch(err => {
- alertDialog.show(err, '确定');
+ alertDialog.show(err, 'Конечно');
});
};
}
@@ -141,7 +141,7 @@ app
.controller('HomeResetPasswordController', ['$scope', '$http', '$state', '$stateParams', 'alertDialog',
($scope, $http, $state, $stateParams, alertDialog) => {
if($scope.config.status) {
- alertDialog.show('请先退出登录再访问重置密码链接', '确定');
+ alertDialog.show('Пожалуйста, выйдите из системы перед доступом к ссылке для сброса пароля.', 'Конечно');
return;
}
$scope.user = {};
@@ -155,7 +155,7 @@ app
}).then(() => {
return alertDialog.close();
}).catch(() => {
- alertDialog.show('该链接已经失效', '确定').then(() => {
+ alertDialog.show('Срок действия этой ссылки истек', 'Конечно').then(() => {
$state.go('home.index');
});
});
@@ -165,11 +165,11 @@ app
token,
password: $scope.user.password,
}).then(() => {
- alertDialog.show('修改密码成功', '确定').then(() => {
+ alertDialog.show('Пароль успешно изменен', 'Конечно').then(() => {
$state.go('home.login');
});
}).catch(() => {
- alertDialog.show('修改密码失败', '确定');
+ alertDialog.show('Смена пароля не удалась', 'Конечно');
});
};
}
@@ -177,7 +177,7 @@ app
.controller('HomeMacLoginController', ['$scope', '$http', '$state', '$stateParams', '$localStorage', 'configManager', 'alertDialog',
($scope, $http, $state, $stateParams, $localStorage, configManager, alertDialog) => {
if($scope.config.status) {
- alertDialog.show('请先退出登录再访问mac登录链接', '确定');
+ alertDialog.show('Пожалуйста, выйдите из системы перед доступом к ссылке для входа на Mac.', 'Конечно');
return;
}
const mac = $stateParams.mac;
@@ -197,7 +197,7 @@ app
.controller('HomeTelegramLoginController', ['$scope', '$http', '$state', '$stateParams', '$localStorage', 'configManager', 'alertDialog',
($scope, $http, $state, $stateParams, $localStorage, configManager, alertDialog) => {
if($scope.config.status) {
- alertDialog.show('请先退出登录再访问telegram登录链接', '确定');
+ alertDialog.show('Пожалуйста, сначала выйдите из системы, а затем перейдите по ссылке для входа в Telegram.', 'Конечно');
return;
}
const token = $stateParams.token;
@@ -217,7 +217,7 @@ app
.controller('HomeRefController', ['$scope', '$state', '$stateParams', '$http', 'alertDialog',
($scope, $state, $stateParams, $http, alertDialog) => {
if($scope.config.status) {
- alertDialog.show('请先退出登录再访问邀请链接', '确定');
+ alertDialog.show('Пожалуйста, выйдите из системы перед доступом к ссылке-приглашению.', 'Конечно');
return;
}
const refId = $stateParams.refId;
@@ -232,7 +232,7 @@ app
.controller('HomeRefInputController', ['$scope', '$state', '$stateParams', '$http', 'alertDialog',
($scope, $state, $stateParams, $http, alertDialog) => {
if($scope.config.status) {
- alertDialog.show('请先退出登录再访问此链接', '确定');
+ alertDialog.show('Пожалуйста, выйдите из системы перед доступом к этой ссылке.', 'Конечно');
return;
}
$scope.home.refInput = true;
@@ -289,7 +289,7 @@ app
$state.go('admin.index');
}
}).catch(err => {
- alertDialog.show('登录失败,请稍后重试', '确定').then(() => { $state.go('home.social'); });
+ alertDialog.show('Не удалось войти, попробуйте еще раз позже', 'Конечно').then(() => { $state.go('home.social'); });
});
}
])
@@ -310,7 +310,7 @@ app
$state.go('admin.index');
}
}).catch(err => {
- alertDialog.show('登录失败,请稍后重试', '确定').then(() => { $state.go('home.social'); });
+ alertDialog.show('Не удалось войти, попробуйте еще раз позже', 'Конечно').then(() => { $state.go('home.social'); });
});
}
])
@@ -332,7 +332,7 @@ app
$state.go('admin.index');
}
}).catch(err => {
- alertDialog.show('登录失败,请稍后重试', '确定').then(() => { $state.go('home.social'); });
+ alertDialog.show('Не удалось войти, попробуйте еще раз позже', 'Конечно').then(() => { $state.go('home.social'); });
});
}
])
@@ -354,7 +354,7 @@ app
$state.go('admin.index');
}
}).catch(err => {
- alertDialog.show('登录失败,请稍后重试', '确定').then(() => { $state.go('home.social'); });
+ alertDialog.show('Не удалось войти, попробуйте еще раз позже', 'Конечно').then(() => { $state.go('home.social'); });
});
}
])
diff --git a/plugins/webgui/public/controllers/user.js b/plugins/webgui/public/controllers/user.js
index 4262fb086..f9e8fcaf1 100644
--- a/plugins/webgui/public/controllers/user.js
+++ b/plugins/webgui/public/controllers/user.js
@@ -36,26 +36,26 @@ app
}
};
$scope.menus = [{
- name: '首页',
+ name: 'Главная страница',
icon: 'home',
click: 'user.index'
}, {
- name: '账号',
+ name: 'Счет',
icon: 'account_circle',
click: 'user.account'
}, {
- name: '订单',
+ name: 'Заказ',
icon: 'attach_money',
click: 'user.order',
hide: true,
}, {
- name: '设置',
+ name: 'Настройки',
icon: 'settings',
click: 'user.settings'
}, {
name: 'divider',
}, {
- name: '退出',
+ name: 'Покинуть',
icon: 'exit_to_app',
click: function() {
$http.post('/api/home/logout').then(() => {
@@ -173,7 +173,7 @@ app
])
.controller('UserIndexController', ['$scope', '$state', 'userApi', 'markdownDialog', '$sessionStorage', 'autopopDialog',
($scope, $state, userApi, markdownDialog, $sessionStorage, autopopDialog) => {
- $scope.setTitle('首页');
+ $scope.setTitle('Главная страница');
$scope.notices = [];
$scope.otherNotices = {};
userApi.getNotice().then(success => {
@@ -222,7 +222,7 @@ app
])
.controller('UserAccountController', ['$scope', '$http', '$mdMedia', 'userApi', '$filter', 'payDialog', 'qrcodeDialog', '$interval', '$localStorage', 'changePasswordDialog', 'payByGiftCardDialog', 'subscribeDialog', '$q', '$state', 'wireGuardConfigDialog',
($scope, $http, $mdMedia, userApi, $filter, payDialog, qrcodeDialog, $interval, $localStorage, changePasswordDialog, payByGiftCardDialog, subscribeDialog, $q, $state, wireGuardConfigDialog) => {
- $scope.setTitle('账号');
+ $scope.setTitle('Счет');
$scope.setFabButton($scope.config.multiAccount ? () => {
$scope.createOrder();
} : null);
@@ -443,7 +443,7 @@ app
};
};
$scope.clipboardSuccess = event => {
- $scope.toast($filter('translate')('二维码链接已复制到剪贴板'));
+ $scope.toast($filter('translate')('Ссылка на QR-код скопирована в буфер обмена.'));
};
$scope.isWG = server => { return (server && server.type === 'WireGuard'); };
$scope.isSS = server => { return (server && server.type === 'Shadowsocks'); };
@@ -455,7 +455,7 @@ app
])
.controller('UserSettingsController', ['$scope', '$state',
($scope, $state) => {
- $scope.setTitle('设置');
+ $scope.setTitle('Настройки');
$scope.toPassword = () => {
$state.go('user.changePassword');
};
@@ -472,7 +472,7 @@ app
])
.controller('UserChangePasswordController', ['$scope', '$state', 'userApi', 'alertDialog', '$http', '$localStorage',
($scope, $state, userApi, alertDialog, $http, $localStorage) => {
- $scope.setTitle('修改密码');
+ $scope.setTitle('Изменить пароль');
$scope.setMenuButton('arrow_back', 'user.settings');
$scope.data = {
password: '',
@@ -482,7 +482,7 @@ app
$scope.confirm = () => {
alertDialog.loading();
userApi.changePassword($scope.data.password, $scope.data.newPassword).then(success => {
- alertDialog.show('修改密码成功,请重新登录', '确定')
+ alertDialog.show('Пароль успешно изменен, пожалуйста, войдите снова', 'Конечно')
.then(() => {
return $http.post('/api/home/logout');
}).then(() => {
@@ -491,7 +491,7 @@ app
$state.go('home.index');
});
}).catch(err => {
- alertDialog.show('修改密码失败', '确定');
+ alertDialog.show('Смена пароля не удалась', 'Конечно');
});
};
}
@@ -520,19 +520,19 @@ app
])
.controller('UserRefController', ['$scope', '$http', '$filter',
($scope, $http, $filter) => {
- $scope.setTitle('邀请码');
+ $scope.setTitle('Код приглашения');
$scope.setMenuButton('arrow_back', 'user.settings');
$http.get('/api/user/ref/code').then(success => { $scope.code = success.data; });
$http.get('/api/user/ref/user').then(success => { $scope.user = success.data; });
$scope.getRefUrl = code => `${ $scope.config.site }/home/ref/${ code }`;
$scope.clipboardSuccess = event => {
- $scope.toast($filter('translate')('邀请链接已复制到剪贴板'));
+ $scope.toast($filter('translate')('Ссылка приглашения скопирована в буфер обмена'));
};
}
])
.controller('UserOrderController', ['$scope', '$http',
($scope, $http) => {
- $scope.setTitle('我的订单');
+ $scope.setTitle('Мои заказы');
$http.get('/api/user/order').then(success => {
$scope.orders = success.data;
});
@@ -540,7 +540,7 @@ app
])
.controller('UserMacAddressController', ['$scope', '$state', '$http', 'addMacAccountDialog',
($scope, $state, $http, addMacAccountDialog) => {
- $scope.setTitle('MAC地址');
+ $scope.setTitle('MAC-адрес');
$scope.setMenuButton('arrow_back', 'user.settings');
const getMacAccount = () => {
$http.get('/api/user/account/mac').then(success => {
@@ -570,7 +570,7 @@ app
])
.controller('UserNoticeController', ['$scope', 'userApi', 'markdownDialog',
($scope, userApi, markdownDialog) => {
- $scope.setTitle('公告');
+ $scope.setTitle('объявление');
$scope.setMenuButton('arrow_back', 'user.index');
userApi.getNotice().then(success => {
$scope.notices = success;
diff --git a/plugins/webgui/public/dialogs/addAccount.js b/plugins/webgui/public/dialogs/addAccount.js
index 11a6441b2..d5c249428 100644
--- a/plugins/webgui/public/dialogs/addAccount.js
+++ b/plugins/webgui/public/dialogs/addAccount.js
@@ -99,7 +99,7 @@ app.factory('addAccountDialog', [ '$mdDialog', '$http', 'configManager', 'alertD
}).then(success => {
hide();
}).catch(err => {
- alertDialog.show('添加失败', '确定');
+ alertDialog.show('Добавить не удалось', 'Конечно');
});
};
};
@@ -156,9 +156,9 @@ app.factory('addAccountDialog', [ '$mdDialog', '$http', 'configManager', 'alertD
accountId: publicInfo.giftcardAccountId === '0' ? null : +publicInfo.giftcardAccountId,
}).then(result => {
if(!result.data.success) {
- alertDialog.show(result.data.message, '确定');
+ alertDialog.show(result.data.message, 'Конечно');
} else {
- alertDialog.show('充值成功', '确定');
+ alertDialog.show('充值成功', 'Конечно');
}
});
};
diff --git a/plugins/webgui/public/dialogs/language.js b/plugins/webgui/public/dialogs/language.js
index 18203f31b..1ad06dd84 100644
--- a/plugins/webgui/public/dialogs/language.js
+++ b/plugins/webgui/public/dialogs/language.js
@@ -36,10 +36,10 @@ app.factory('languageDialog' , [ '$mdDialog', $mdDialog => {
$scope.publicInfo.hide();
};
$scope.languages = [
- { id: 'zh-CN', name: '中文' },
+ { id: 'zh-CN', name: 'Китайский' },
{ id: 'en-US', name: 'English' },
- { id: 'ja-JP', name: '日本語' },
- { id: 'ko-KR', name: '한국' },
+ { id: 'ja-JP', name: 'Японский' },
+ { id: 'ko-KR', name: 'Корейский' },
{ id: 'ru-RU', name: 'Русский' },
];
$scope.languages.forEach(language => {
diff --git a/plugins/webgui/public/dialogs/order.js b/plugins/webgui/public/dialogs/order.js
index 2ca399f9c..1869391a7 100644
--- a/plugins/webgui/public/dialogs/order.js
+++ b/plugins/webgui/public/dialogs/order.js
@@ -61,7 +61,7 @@ app.factory('orderFilterDialog' , [ '$mdDialog', '$http', ($mdDialog, $http) =>
const publicInfo = {};
$http.get('/api/admin/group').then(success => {
publicInfo.groups = success.data;
- publicInfo.groups.unshift({ id: -1, name: '所有组', comment: '' });
+ publicInfo.groups.unshift({ id: -1, name: 'Все группы', comment: '' });
});
const hide = () => {
return $mdDialog.hide()
diff --git a/plugins/webgui/public/dialogs/pay.js b/plugins/webgui/public/dialogs/pay.js
index 4ae71627a..444667c9a 100644
--- a/plugins/webgui/public/dialogs/pay.js
+++ b/plugins/webgui/public/dialogs/pay.js
@@ -6,21 +6,21 @@ app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$loc
const publicInfo = {
config: configManager.getConfig(),
time: [{
- type: 'hour', name: '一小时'
+ type: 'hour', name: 'Один час'
}, {
- type: 'day', name: '一天'
+ type: 'day', name: 'Один день'
}, {
- type: 'week', name: '一周'
+ type: 'week', name: 'Одна неделя'
}, {
- type: 'month', name: '一个月'
+ type: 'month', name: 'Один месяц'
}, {
- type: 'season', name: '三个月'
+ type: 'season', name: 'Квартал'
}, {
- type: 'year', name: '一年'
+ type: 'year', name: 'Один год'
}],
payType: [],
};
- if(publicInfo.config.alipay) { publicInfo.payType.push({ type: 'alipay', name: '支付宝' }); }
+ if(publicInfo.config.alipay) { publicInfo.payType.push({ type: 'alipay', name: 'Alipay' }); }
if(publicInfo.config.paypal) { publicInfo.payType.push({ type: 'paypal', name: 'Paypal' }); }
if(publicInfo.config.giftcard) { publicInfo.payType.push({ type: 'giftcard', name: '充值码' }); }
publicInfo.myPayType = publicInfo.payType[0] ? publicInfo.payType[0].type : undefined;
@@ -43,7 +43,7 @@ app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$loc
const orderStatus = success.data.status;
if(orderStatus === 'TRADE_SUCCESS' || orderStatus === 'FINISH') {
publicInfo.status = 'success';
- publicInfo.message = '订单会在两分钟内生效,请稍候';
+ publicInfo.message = 'Приказ вступит в силу в течение двух минут, пожалуйста, подождите';
interval && $interval.cancel(interval);
}
});
@@ -85,7 +85,7 @@ app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$loc
return paypal.request.post(EXECUTE_URL, data)
.then(function (res) {
publicInfo.status = 'success';
- publicInfo.message = '订单会在两分钟内生效,请稍候';
+ publicInfo.message = 'Приказ вступит в силу в течение двух минут, пожалуйста, подождите';
});
}
}, '#paypal-button-container');
@@ -168,7 +168,7 @@ app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$loc
const data = result.data;
if (data.success) {
publicInfo.status = 'success';
- publicInfo.message = `充值码[ ${ publicInfo.giftCardPassword } ]使用成功`;
+ publicInfo.message = `Код пополнения[ ${ publicInfo.giftCardPassword } ]Успешное использование`;
publicInfo.giftCardPassword = '';
} else {
publicInfo.status = 'error';
@@ -176,7 +176,7 @@ app.factory('payDialog' , [ '$mdDialog', '$interval', '$timeout', '$http', '$loc
}
}).catch(err => {
publicInfo.status = 'error';
- publicInfo.message = '充值出现错误';
+ publicInfo.message = 'Ошибка перезарядки';
});
};
const jumpToPayPage = () => {
diff --git a/plugins/webgui/public/dialogs/payByGiftCard.js b/plugins/webgui/public/dialogs/payByGiftCard.js
index a2bc9dd46..f59d45440 100644
--- a/plugins/webgui/public/dialogs/payByGiftCard.js
+++ b/plugins/webgui/public/dialogs/payByGiftCard.js
@@ -39,12 +39,12 @@ app.factory('payByGiftCardDialog', ['$mdDialog', '$http', '$filter',
publicInfo.status = "finish";
const dat = result.data;
if (dat.success) {
- publicInfo.message = `成功充值${prettyOrderType(dat.type)}卡(卡号 ${dat.cardId})`;
+ publicInfo.message = `Успешное пополнение${prettyOrderType(dat.type)}Карточка(номер карты ${dat.cardId})`;
} else {
publicInfo.message = dat.message;
}
})
- .catch((err) => { publicInfo.status = "finish"; publicInfo.message = "充值出现错误"; });
+ .catch((err) => { publicInfo.status = "finish"; publicInfo.message = "Ошибка перезарядки"; });
};
publicInfo.close = close;
publicInfo.submit = submit;
diff --git a/plugins/webgui/public/dialogs/qrcode.js b/plugins/webgui/public/dialogs/qrcode.js
index bb5d9d87a..a4266302c 100644
--- a/plugins/webgui/public/dialogs/qrcode.js
+++ b/plugins/webgui/public/dialogs/qrcode.js
@@ -17,7 +17,7 @@ app.factory('qrcodeDialog', [ '$mdDialog', '$mdToast', ($mdDialog, $mdToast) =>
const toast = (delay = 3000) => {
$mdToast.show(
$mdToast.simple()
- .textContent('链接已复制')
+ .textContent('Ссылка скопирована.')
.position('top right')
.hideDelay(delay)
);
diff --git a/plugins/webgui/public/dialogs/subscribe.js b/plugins/webgui/public/dialogs/subscribe.js
index beb831c4d..304a300f9 100644
--- a/plugins/webgui/public/dialogs/subscribe.js
+++ b/plugins/webgui/public/dialogs/subscribe.js
@@ -64,7 +64,7 @@ app.factory('subscribeDialog', [ '$mdDialog', '$http', 'configManager', ($mdDial
$scope.toast = () => {
$mdToast.show(
$mdToast.simple()
- .textContent('链接已复制到剪贴板')
+ .textContent('Ссылка скопирована в буфер обмена')
.position('top right')
.hideDelay(3000)
);
diff --git a/plugins/webgui/public/dialogs/user.js b/plugins/webgui/public/dialogs/user.js
index db6aff6de..d85e4d03e 100644
--- a/plugins/webgui/public/dialogs/user.js
+++ b/plugins/webgui/public/dialogs/user.js
@@ -6,7 +6,7 @@ app.factory('userSortDialog' , [ '$mdDialog', '$http', ($mdDialog, $http) => {
const publicInfo = {};
$http.get('/api/admin/group').then(success => {
publicInfo.groups = success.data;
- publicInfo.groups.unshift({ id: -1, name: '所有组', comment: '' });
+ publicInfo.groups.unshift({ id: -1, name: 'Все группы', comment: '' });
});
const hide = () => {
return $mdDialog.hide()
diff --git a/plugins/webgui/public/filters/giftcard.js b/plugins/webgui/public/filters/giftcard.js
index 2a0f38dd2..e2896a343 100644
--- a/plugins/webgui/public/filters/giftcard.js
+++ b/plugins/webgui/public/filters/giftcard.js
@@ -3,10 +3,10 @@ const app = angular.module('app');
app.filter('prettyPrintBatchStatus', function () {
return function (status) {
const result = {
- AVAILABLE: '可用',
- USEDUP: '售罄',
- REVOKED: '召回'
+ AVAILABLE: 'Доступный',
+ USEDUP: 'распроданный',
+ REVOKED: 'отзывать'
};
- return result[status] || '其它';
+ return result[status] || 'другой';
};
});
diff --git a/plugins/webgui/public/filters/orderStatus.js b/plugins/webgui/public/filters/orderStatus.js
index 76ffe8fbd..0a88f1e42 100644
--- a/plugins/webgui/public/filters/orderStatus.js
+++ b/plugins/webgui/public/filters/orderStatus.js
@@ -3,18 +3,18 @@ const app = angular.module('app');
app.filter('order', function () {
return function (status) {
const result = {
- CREATE: '创建',
- WAIT_BUYER_PAY: '等待',
- TRADE_SUCCESS: '付款',
- FINISH: '完成',
- USED: '完成',
- TRADE_CLOSED: '关闭',
- created: '创建',
- approved: '付款',
- finish: '完成',
- closed: '关闭',
+ CREATE: 'создавать',
+ WAIT_BUYER_PAY: 'ждать',
+ TRADE_SUCCESS: 'Оплата',
+ FINISH: 'Заканчивать',
+ USED: 'Заканчивать',
+ TRADE_CLOSED: 'закрытие',
+ created: 'создавать',
+ approved: 'Оплата',
+ finish: 'Заканчивать',
+ closed: 'закрытие',
};
- return result[status] || '其它';
+ return result[status] || 'другой';
};
})
.filter('prettyOrderId', function () {
@@ -25,14 +25,14 @@ app.filter('order', function () {
// TODO: 将此处的类型和其他地方的类型代码全部集中到一处
return function (type) {
const cardType = {
- 5: '小时',
- 4: '日',
- 2: '周',
- 3: '月',
- 6: '季度',
- 7: '年',
- 8: '两周',
- 9: '半年',
+ 5: 'Час',
+ 4: 'день',
+ 2: 'неделя',
+ 3: 'масяц',
+ 6: 'Квартал',
+ 7: 'Год',
+ 8: 'Две недели',
+ 9: 'Полгода',
};
return cardType[type];
};
diff --git a/plugins/webgui/public/filters/time.js b/plugins/webgui/public/filters/time.js
index 8f76b97e1..a7d25868f 100644
--- a/plugins/webgui/public/filters/time.js
+++ b/plugins/webgui/public/filters/time.js
@@ -11,22 +11,22 @@ app.filter('timeago', function() {
if (time < 0) {
time = -time;
} else {
- retTail = '前';
+ retTail = 'вперед';
}
const day = Math.trunc(time / (24 * 3600 * 1000));
const hour = Math.trunc(time % (24 * 3600 * 1000) / (3600 * 1000));
const minute = Math.trunc(time % (24 * 3600 * 1000) % (3600 * 1000) / (60 * 1000));
if (day) {
- ret += day + '天';
+ ret += day + 'дни';
}
if (day || hour) {
- ret += hour + '小时';
+ ret += hour + 'часы';
}
if (!day && (hour || minute)) {
- ret += minute + '分钟';
+ ret += minute + 'минута';
}
if (time < (60 * 1000)) {
- ret = '几秒';
+ ret = 'секунды';
}
return ret + retTail;
};
@@ -47,20 +47,20 @@ app.filter('timeagoshort', function() {
if (time < 0) {
time = -time;
} else {
- retTail = '前';
+ retTail = 'вперед';
}
const day = Math.trunc(time / (24 * 3600 * 1000));
const hour = Math.trunc(time % (24 * 3600 * 1000) / (3600 * 1000));
const minute = Math.trunc(time % (24 * 3600 * 1000) % (3600 * 1000) / (60 * 1000));
if (day) {
- ret += day + '天';
+ ret += day + 'дни';
} else if (hour) {
- ret += hour + '小时';
+ ret += hour + 'часы';
} else if (minute) {
- ret += minute + '分钟';
+ ret += minute + 'минута';
} else if (time < (60 * 1000)) {
- ret = '几秒';
+ ret = 'секунды';
}
return ret + retTail;
};
@@ -72,9 +72,9 @@ app.filter('translateTime', ['$translate', $translate => {
if(currentLanguage === 'zh-CN') {
return input;
} else if (currentLanguage === 'en-US') {
- const matchDay = input.match(/([0-9]){1,}天/);
- const matchHour = input.match(/([0-9]){1,}小时/);
- const matchMinute = input.match(/([0-9]){1,}分/);
+ const matchDay = input.match(/([0-9]){1,}дни/);
+ const matchHour = input.match(/([0-9]){1,}часы/);
+ const matchMinute = input.match(/([0-9]){1,}минуты/);
let ret = '';
if(matchDay) {
ret += matchDay[0].substr(0, matchDay[0].length - 1) + (+matchDay[0].substr(0, matchDay[0].length - 1) <= 1 ? ' day ' : ' days ');
@@ -85,10 +85,10 @@ app.filter('translateTime', ['$translate', $translate => {
if(matchMinute) {
ret += matchMinute[0].substr(0, matchMinute[0].length - 1) + (+matchMinute[0].substr(0, matchMinute[0].length - 1) <= 1 ? ' min ' : ' mins');
}
- if(input.match(/几秒/)) {
+ if(input.match(/секунды/)) {
ret += 'a few seconds';
}
- if(input.match(/前$/)) {
+ if(input.match(/назад$/)) {
ret += ' ago';
}
return ret;
@@ -107,16 +107,16 @@ app.filter('timePeriod', [() => {
const hour = Math.trunc(time % (24 * 3600 * 1000) / (3600 * 1000));
const minute = Math.trunc(time % (24 * 3600 * 1000) % (3600 * 1000) / (60 * 1000));
if (day) {
- ret += day + '天';
+ ret += day + 'дни';
}
if (day || hour) {
- ret += hour + '小时';
+ ret += hour + 'часы';
}
if (!day && (hour || minute)) {
- ret += minute + '分钟';
+ ret += minute + 'минута';
}
if (time < (60 * 1000)) {
- ret = '几秒';
+ ret = 'секунды';
}
return ret;
};
diff --git a/plugins/webgui/public/services/adminService.js b/plugins/webgui/public/services/adminService.js
index 7fd1374a5..c3edfc09e 100644
--- a/plugins/webgui/public/services/adminService.js
+++ b/plugins/webgui/public/services/adminService.js
@@ -31,10 +31,10 @@ app.factory('adminApi', ['$http', '$q', 'moment', 'preload', '$timeout', 'config
}).filter(f => f);
}
let url;
- if(payType === '支付宝') { url = '/api/admin/alipay'; }
+ if(payType === 'Alipay') { url = '/api/admin/alipay'; }
if(payType === 'Paypal') { url = '/api/admin/paypal'; }
- if(payType === '充值码') { url = '/api/admin/giftcard'; }
- if(payType === '邀请码') { url = '/api/admin/refOrder'; }
+ if(payType === 'Код пополнения') { url = '/api/admin/giftcard'; }
+ if(payType === 'Код приглашения') { url = '/api/admin/refOrder'; }
const search = opt.search || '';
const filter = opt.filter || '';
// const sort = opt.sort || 'alipay.createTime_desc';
@@ -45,10 +45,10 @@ app.factory('adminApi', ['$http', '$q', 'moment', 'preload', '$timeout', 'config
const getCsvOrder = (payType, opt = {}) => {
let url;
- if(payType === '支付宝') { url = '/api/admin/alipay/csv'; }
+ if(payType === 'Alipay') { url = '/api/admin/alipay/csv'; }
if(payType === 'Paypal') { url = '/api/admin/paypal/csv'; }
- if(payType === '充值码') { url = '/api/admin/giftcard/csv'; }
- if(payType === '邀请码') { url = '/api/admin/refOrder/csv'; }
+ if(payType === 'Код пополнения') { url = '/api/admin/giftcard/csv'; }
+ if(payType === 'Код приглашения') { url = '/api/admin/refOrder/csv'; }
let downloadUrl = url + '?';
for(const o in opt) {
if(Array.isArray(opt[o])) {
diff --git a/plugins/webgui/public/services/homeService.js b/plugins/webgui/public/services/homeService.js
index bde031857..4e1e3bde1 100644
--- a/plugins/webgui/public/services/homeService.js
+++ b/plugins/webgui/public/services/homeService.js
@@ -11,11 +11,11 @@ app.factory('homeApi', ['$http', $http => {
.then(success => success.data)
.catch(err => {
if(err.status === 403) {
- let errData = '用户注册失败';
- if(err.data === 'user exists') { errData = '该用户已存在'; }
+ let errData = 'Регистрация пользователя не удалась';
+ if(err.data === 'user exists') { errData = 'Пользователь уже существует'; }
return Promise.reject(errData);
} else {
- return Promise.reject('网络异常,请稍后再试');
+ return Promise.reject('Неисправность сети, попробуйте еще раз позже');
}
});
};
@@ -27,13 +27,13 @@ app.factory('homeApi', ['$http', $http => {
return success.data;
}).catch(err => {
if(err.status === 403) {
- let errData = '用户名或密码错误';
- if(err.data === 'user not exists') { errData = '该用户尚未注册'; }
- if(err.data === 'invalid body') { errData = '请输入正确的用户名格式'; }
- if(err.data === 'password retry out of limit') { errData = '密码重试次数已达上限\n请稍后再试'; }
+ let errData = 'Неправильное имя пользователя или пароль';
+ if(err.data === 'user not exists') { errData = 'Пользователь еще не зарегистрирован'; }
+ if(err.data === 'invalid body') { errData = 'Введите правильный формат имени пользователя.'; }
+ if(err.data === 'password retry out of limit') { errData = 'Достигнуто максимальное количество попыток ввода пароля.\nПопробуйте еще раз позже.'; }
return Promise.reject(errData);
} else {
- return Promise.reject('网络异常,请稍后再试');
+ return Promise.reject('Неисправность сети, попробуйте еще раз позже');
}
});
};
@@ -45,33 +45,33 @@ app.factory('homeApi', ['$http', $http => {
return 'success';
}).catch(err => {
if(err.status === 403) {
- let errData = '验证码发送错误';
- if(err.data === 'invalid ref code') { errData = '发送错误,无效的邀请码'; }
- if(err.data === 'email in black list') { errData = '发送错误,请更换邮箱尝试'; }
- if(err.data === 'send email out of limit') { errData = '请求过于频繁,请稍后再试'; }
- if(err.data === 'signup close') { errData = '当前时段尚未开放注册'; }
+ let errData = 'Ошибка отправки проверочного кода';
+ if(err.data === 'invalid ref code') { errData = 'Ошибка отправки, неверный код приглашения'; }
+ if(err.data === 'email in black list') { errData = 'Ошибка отправки, попробуйте другой адрес электронной почты'; }
+ if(err.data === 'send email out of limit') { errData = 'Запрос слишком частый, попробуйте еще раз позже'; }
+ if(err.data === 'signup close') { errData = 'Регистрация на текущий период не открыта'; }
return Promise.reject(errData);
} else {
- return Promise.reject('网络异常,请稍后再试');
+ return Promise.reject('Неисправность сети, попробуйте еще раз позже');
}
});
};
const findPassword = email => {
if(!email) {
- return Promise.reject('请输入邮箱地址再点击“找回密码”');
+ return Promise.reject('Введите свой адрес электронной почты и нажмите «Восстановить пароль».');
};
return $http.post('/api/home/password/sendEmail', {
email,
}).then(success => {
- return '重置密码链接已发至您的邮箱,\n请注意查收';
+ return 'Ссылка для сброса пароля была отправлена на ваш адрес электронной почты, \nпожалуйста, проверьте ее.';
}).catch(err => {
let errData = null;
if(err.status === 403 && err.data === 'already send') {
- errData = '重置密码链接已经发送,\n请勿重复发送';
+ errData = 'Ссылка для сброса пароля была отправлена. \nПожалуйста, не отправляйте ее снова.';
} else if(err.status === 403 && err.data === 'user not exists') {
- errData = '请输入正确的邮箱地址';
+ errData = 'Пожалуйста, введите действительный адрес электронной почты';
} else {
- errData = '网络异常,请稍后再试';
+ errData = 'Неисправность сети, попробуйте еще раз позже';
}
return Promise.reject(errData);
});
diff --git a/plugins/webgui/public/translate/ru-RU.js b/plugins/webgui/public/translate/ru-RU.js
index 690965a04..5844560ea 100644
--- a/plugins/webgui/public/translate/ru-RU.js
+++ b/plugins/webgui/public/translate/ru-RU.js
@@ -1,4 +1,4 @@
-module.exports={
+module.exports = {
'首页': 'Домашняя',
'登录': 'Вход',
'注册': 'Регистрация',
@@ -31,7 +31,6 @@ module.exports={
'设置': 'Настройки',
'退出': 'Выход',
'我的账号': 'Моя учетная запись',
- '账号': 'Номер счета',
'点击进入': 'Нажмите, чтобы ввести',
'公告': 'Объявление',
'暂无公告': 'Нет объявлений',
@@ -95,7 +94,7 @@ module.exports={
'请求过于频繁,请稍后再试': 'Превышено максимальное количество ввода. Повторите попытку позднее',
'当前时段尚未开放注册': 'Текущий период еще не открыт для регистрации',
'重置密码链接已发至您的邮箱,\n请注意查收': 'Ссылка на сброс пароля была отправлена на ваш адрес электронной почты, \n пожалуйста, проверьте почтовый ящик',
- '重置密码链接已经发送,\n请勿重复发送': 'Сброс пароля ссылка была отправлена, \n Не отправлять его снова',
+ '重置密码链接已经发送,\n请勿重复发送': 'Сброс пароля ссылка была отправлена, \n Не отправлять ее снова',
'请输入正确的邮箱地址': 'Введите правильный адрес электронной почты',
'已过期': 'Истёк',
'支付成功': 'Успешный платеж',
@@ -115,12 +114,156 @@ module.exports={
'等待': 'подождите',
'付款': 'оплата',
'完成': 'полный',
- '关闭': 'близко',
'原密码': 'Исходный пароль',
'新密码': 'Новый пароль',
'重复新密码': 'Повторить новый пароль',
'类型': 'тип',
'端口': 'порт',
'流量(MB)': 'Трафик (МБ)',
- '接收消息推送': 'Приём сообщения'
-};
+ '接收消息推送': 'Приём сообщения',
+ '地址': 'адрес',
+ '公钥': 'публичный ключ',
+ '私钥': 'приватный ключ',
+ '流量倍率': 'коэффициент трафика',
+ '未激活': 'неактивен',
+ '从订单中选择类型': 'Выбор типа из заказа',
+ '到期自动删除': 'Автоудаление по истечению срока',
+ '自定义新用户可用服务器': 'Настройка доступных серверов для новых пользователей',
+ '新用户分组': 'Группа новых пользователей',
+ '新端口号分配范围': 'Диапазон назначения новых портов',
+ '起始端口': 'Начальный порт',
+ '结束端口': 'Конечный порт',
+ '开启订阅功能': 'Включение функции подписки',
+ '开启MAC地址订阅功能': 'Включение подписки по MAC-адресу',
+ '精简模式': 'Упрощенный режим',
+ '显示用户不可用的服务器': 'Показать недоступные пользователю серверы',
+ '显示账号类型': 'Показать тип аккаунта',
+ '排序方式': 'Способ сортировки',
+ '端口号 ↑': 'Порт ↑',
+ '端口号 ↓': 'Порт ↓',
+ '过期时间 ↑': 'Срок действия ↑',
+ '过期时间 ↓': 'Срок действия ↓',
+ '过滤条件': 'Фильтр',
+ '未过期': 'Не истёкший',
+ '已绑定用户': 'Связанный пользователь',
+ '未绑定用户': 'Несвязанный пользователь',
+ '无期限': 'Без срока',
+ 'MAC地址': 'MAC-адрес',
+ '订单类型': 'Тип заказа',
+ '端口不能为空': 'Порт не может быть пустым',
+ '流量不能为空': 'Трафик не может быть пустым',
+ '自动删除延迟': 'Задержка автоматического удаления',
+ '自定义服务器': 'Пользовательский сервер',
+ '指定用户(可选)': 'Назначенный пользователь (необязательно)',
+ '没有匹配的用户': 'Нет совпадающих пользователей',
+ '名称': 'Название',
+ '不能名称为空': 'Название не может быть пустым',
+ '备注不能为空': 'Примечание не может быть пустым',
+ '允许购买多个账号': 'Разрешить покупку нескольких аккаунтов',
+ '标题': 'Заголовок',
+ '内容': 'Содержимое',
+ '自动弹出': 'Автоматическое всплытие',
+ '预览': 'Предпросмотр',
+ '保存': 'Сохранить',
+ '短备注': 'Краткое замечание',
+ '周期': 'Период',
+ '支付宝': 'Alipay',
+ 'Paypal': 'Paypal',
+ '邀请获得时长': 'Время получения по приглашению',
+ '续费允许更换套餐': 'Разрешить смену пакета при продлении',
+ '自动激活': 'Автоматическая активация',
+ '自定义分组': 'Настроить группу',
+ '将改动变更到已有的账号': 'Применить изменения к существующему аккаунту',
+ '删除': 'Удалить',
+ '流量(MB)': 'Трафик (MB)',
+ '订单名称': 'Название заказа',
+ '自定义可用服务器': 'Настроить доступные серверы',
+ '复制链接': 'Копировать ссылку',
+ '最大邀请次数': 'Максимальное количество приглашений',
+ '访问次数': 'Количество посещений',
+ '网段': 'Подсеть',
+ 'WireGuard端口': 'Порт WireGuard',
+ 'Trojan端口': 'Порт Trojan',
+ '请填写加密方式': 'Введите метод шифрования',
+ '端口偏移': 'Смещение порта',
+ '端口偏移量不能为空': 'Смещение порта не может быть пустым',
+ '插件参数': 'Параметры плагина',
+ '请输入标签': 'Введите теги',
+ '普通用户': 'Обычный пользователь',
+ '管理员': 'Администратор',
+ '邮箱不能为空': 'Электронная почта не может быть пустой',
+ '注册时间': 'Дата регистрации',
+ '分组': 'Группа',
+ '设置分组': 'Настроить группу',
+ '删除用户': 'Удалить пользователя',
+ '网站短标题': 'Краткое название сайта',
+ '使用Service Worker缓存静态页面': 'Использовать Service Worker для кэширования статических страниц',
+ '主题颜色': 'Основной цвет темы',
+ '主题第二颜色': 'Вторичный цвет темы',
+ '修改登录密码': 'Изменить пароль',
+ '原密码': 'Старый пароль',
+ '新密码': 'Новый пароль',
+ '重复新密码': 'Подтвердите новый пароль',
+ '确认': 'Подтвердить',
+ '更改类型时保持过期时间不变': 'Сохранять время истечения при изменении типа',
+ '清除该账号流量': 'Очистить трафик этого аккаунта',
+ '短备注': 'Краткая заметка',
+ '流量包': 'Пакет данных',
+ '普通订单': 'Обычный заказ',
+ '开始日期': 'Дата начала',
+ '结束日期': 'Дата окончания',
+ '创建': 'Создание',
+ '等待': 'Ожидает оплаты',
+ '付款': 'Оплачено',
+ '完成': 'Завершено',
+ '关闭': 'Закрыто',
+ '编辑': 'Редактировать',
+ '暂无可分配的账号': 'Нет доступных аккаунтов для распределения',
+ '开始时间:': 'Время начала:',
+ '到期时间:': 'Время окончания:',
+ '时长:': 'Продолжительность:',
+ '当前没有生成邀请码': 'В данный момент код приглашения не сгенерирован',
+ '启用邀请码功能': 'Включить функцию приглашений с использованием кода',
+ '关闭注册时仍可使用邀请码': 'Код приглашения может быть использован, даже если регистрация закрыта',
+ '每个用户拥有邀请码数量': 'Количество кодов приглашений у каждого пользователя',
+ '每个邀请码可邀请的用户数': 'Количество пользователей, которых можно пригласить с помощью одного кода приглашения',
+ '邀请码列表': 'Список кодов приглашений',
+ '邀请用户列表': 'Список приглашенных пользователей',
+ '我的邀请码': 'Мои коды приглашений',
+ '当前没有邀请的用户': 'Нет приглашенных пользователей на данный момент',
+ '邀请码': 'Код приглашения',
+ '邀请人': 'Пригласивший пользователь',
+ '注册用户': 'Зарегистрированный пользователь',
+ '时间': 'Время',
+ '没有服务器': 'Нет серверов',
+ '点击这里添加': 'Нажмите здесь, чтобы добавить',
+ '离线': 'Офлайн',
+ '本日流量': 'Трафик за сегодня',
+ '本周流量': 'Трафик за неделю',
+ '本月流量': 'Трафик за месяц',
+ '时': 'Час',
+ '天': 'День',
+ '周': 'Неделя',
+ '全部': 'Все',
+ '可用': 'Доступно',
+ '停止': 'Остановлено',
+ '在线': 'Онлайн',
+ '服务器连接失败': 'Не удалось подключиться к серверу',
+ '到期时间': 'Время истечения срока',
+ '请添加 Telegram 账号': 'Пожалуйста, добавьте аккаунт Telegram',
+ '并输入“{{ code.code }}”完成绑定': 'и введите "{{ code.code }}" для завершения привязки',
+ '已绑定': 'Привязано',
+ '解除绑定': 'Отвязать',
+ '该页面尚未完工': 'Эта страница еще не завершена',
+ '邀请人': 'Пригласивший',
+ '发送邮件': 'Отправить письмо',
+ 'mac账号': 'MAC аккаунт',
+ '邀请用户': 'Приглашённые пользователи',
+ '充值码订单': 'Заказы пополнения',
+ 'Ref订单': 'Заказы Ref',
+ '排序方式': 'Способ сортировки:',
+ '用户类型': 'Тип пользователя:',
+ '普通': 'Обычный',
+ '管理员': 'Администратор',
+ '分组': 'Группа:'
+};
\ No newline at end of file
diff --git a/plugins/webgui/public/views/admin/account.html b/plugins/webgui/public/views/admin/account.html
index a402ddb41..e2468930b 100644
--- a/plugins/webgui/public/views/admin/account.html
+++ b/plugins/webgui/public/views/admin/account.html
@@ -1,5 +1,5 @@
-
-
没有账号
点击这里添加
+
+
Нет аккаунтов
Нажмите здесь, чтобы добавить
+
\ No newline at end of file
diff --git a/plugins/webgui/public/views/admin/accountPage.html b/plugins/webgui/public/views/admin/accountPage.html
index 6b9879e33..0a1f651cf 100644
--- a/plugins/webgui/public/views/admin/accountPage.html
+++ b/plugins/webgui/public/views/admin/accountPage.html
@@ -3,7 +3,7 @@