Refine pluralization of some English words (#7318)

* Refine plural translation of English words

* Remove useless i18n modifier
pull/7321/head
John Niang 2024-12-11 09:23:37 +08:00 committed by GitHub
parent b33cce3059
commit 01defdf0f6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
59 changed files with 395 additions and 315 deletions

View File

@ -53,7 +53,7 @@
"vue-clipboard3": "^2.0.0", "vue-clipboard3": "^2.0.0",
"vue-codemirror": "^6.1.1", "vue-codemirror": "^6.1.1",
"vue-demi": "^0.14.6", "vue-demi": "^0.14.6",
"vue-i18n": "^9.13.1", "vue-i18n": "^10.0.5",
"vue-router": "^4.3.3" "vue-router": "^4.3.3"
}, },
"devDependencies": { "devDependencies": {

View File

@ -7,7 +7,7 @@
:before-close="handleClose" :before-close="handleClose"
> >
<template #header> <template #header>
<Header :header="$t('website.group')" :back="handleClose"></Header> <Header :header="$t('website.manageGroup')" :back="handleClose"></Header>
</template> </template>
<ComplexTable :data="data" @search="search()"> <ComplexTable :data="data" @search="search()">

View File

@ -7,13 +7,13 @@
<div style="margin-left: 15px"> <div style="margin-left: 15px">
<span>{{ $t('commons.table.refreshRate') }}</span> <span>{{ $t('commons.table.refreshRate') }}</span>
<el-select style="margin-left: 5px; width: 120px" v-model="refreshRate" @change="changeRefresh"> <el-select style="margin-left: 5px; width: 120px" v-model="refreshRate" @change="changeRefresh">
<el-option :label="$t('commons.table.noRefresh')" :value="0"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 0)" :value="0"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [5])" :value="5"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 5)" :value="5"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [10])" :value="10"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 10)" :value="10"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [30])" :value="30"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 30)" :value="30"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [60])" :value="60"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 60)" :value="60"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [120])" :value="120"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 120)" :value="120"></el-option>
<el-option :label="$t('commons.table.refreshRateUnit', [300])" :value="300"></el-option> <el-option :label="$t('commons.table.refreshRateUnit', 300)" :value="300"></el-option>
</el-select> </el-select>
</div> </div>
</el-popover> </el-popover>

View File

@ -7,6 +7,7 @@ import * as echarts from 'echarts';
import { GlobalStore } from '@/store'; import { GlobalStore } from '@/store';
import { computeSizeFromKBs, computeSizeFromKB, computeSizeFromMB } from '@/utils/util'; import { computeSizeFromKBs, computeSizeFromKB, computeSizeFromMB } from '@/utils/util';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import i18n from '@/lang';
const globalStore = GlobalStore(); const globalStore = GlobalStore();
const { isDarkTheme } = storeToRefs(globalStore); const { isDarkTheme } = storeToRefs(globalStore);
@ -153,17 +154,35 @@ function initChart() {
switch (props.option.formatStr) { switch (props.option.formatStr) {
case 'KB/s': case 'KB/s':
for (const item of datas) { for (const item of datas) {
res += item.marker + ' ' + item.seriesName + '' + computeSizeFromKBs(item.data) + '<br/>'; res +=
item.marker +
' ' +
item.seriesName +
i18n.global.t('commons.colon') +
computeSizeFromKBs(item.data) +
'<br/>';
} }
break; break;
case 'KB': case 'KB':
for (const item of datas) { for (const item of datas) {
res += item.marker + ' ' + item.seriesName + '' + computeSizeFromKB(item.data) + '<br/>'; res +=
item.marker +
' ' +
item.seriesName +
i18n.global.t('commons.colon') +
computeSizeFromKB(item.data) +
'<br/>';
} }
break; break;
case 'MB': case 'MB':
for (const item of datas) { for (const item of datas) {
res += item.marker + ' ' + item.seriesName + '' + computeSizeFromMB(item.data) + '<br/>'; res +=
item.marker +
' ' +
item.seriesName +
i18n.global.t('commons.colon') +
computeSizeFromMB(item.data) +
'<br/>';
} }
break; break;
default: default:
@ -172,7 +191,7 @@ function initChart() {
item.marker + item.marker +
' ' + ' ' +
item.seriesName + item.seriesName +
'' + i18n.global.t('commons.colon') +
item.data + item.data +
props.option.formatStr + props.option.formatStr +
'<br/>'; '<br/>';

View File

@ -6,6 +6,7 @@ import en from './modules/en';
const i18n = createI18n({ const i18n = createI18n({
legacy: false, legacy: false,
locale: localStorage.getItem('lang') || 'zh', locale: localStorage.getItem('lang') || 'zh',
fallbackLocale: 'en',
globalInjection: true, globalInjection: true,
messages: { messages: {
zh, zh,

View File

@ -10,13 +10,14 @@ const message = {
commons: { commons: {
true: 'true', true: 'true',
false: 'false', false: 'false',
colon: ': ',
example: 'For example, ', example: 'For example, ',
fit2cloud: 'FIT2CLOUD', fit2cloud: 'FIT2CLOUD',
button: { button: {
create: 'Create ', create: 'Create ',
add: 'Add ', add: 'Add ',
save: 'Save ', save: 'Save ',
set: 'Setting', set: 'Configure',
sync: 'Sync ', sync: 'Sync ',
delete: 'Delete', delete: 'Delete',
edit: 'Edit ', edit: 'Edit ',
@ -38,7 +39,7 @@ const message = {
handle: 'Trigger', handle: 'Trigger',
expand: 'Expand', expand: 'Expand',
collapse: 'Collapse', collapse: 'Collapse',
log: 'Log', log: 'View logs',
back: 'Back', back: 'Back',
backup: 'Backup', backup: 'Backup',
recover: 'Recover', recover: 'Recover',
@ -57,8 +58,8 @@ const message = {
copy: 'Copy', copy: 'Copy',
random: 'Random', random: 'Random',
uninstall: 'Uninstall', uninstall: 'Uninstall',
fullscreen: 'WebsiteFullscreen', fullscreen: 'Enter fullscreen',
quitFullscreen: 'Quit WebsiteFullscreen', quitFullscreen: 'Exit fullscreen',
update: 'Edit', update: 'Edit',
showAll: 'Show All', showAll: 'Show All',
hideSome: 'Hide Some', hideSome: 'Hide Some',
@ -94,19 +95,18 @@ const message = {
publishedAt: 'Publish time', publishedAt: 'Publish time',
date: 'Date', date: 'Date',
updatedAt: 'Update time', updatedAt: 'Update time',
operate: 'Operation(s)', operate: 'Operations',
message: 'Message', message: 'Message',
description: 'Description', description: 'Description',
interval: 'Interval', interval: 'Interval',
user: 'User', user: 'Owner',
title: 'Title', title: 'Title',
port: 'Ports', port: 'Port',
forward: 'Forward', forward: 'Forward',
protocol: 'Protocol', protocol: 'Protocol',
tableSetting: 'Table setting', tableSetting: 'Table setting',
refreshRate: 'Rate', refreshRate: 'Rate',
noRefresh: 'No refresh', refreshRateUnit: 'No refresh | {n} second/time | {n} seconds/time',
refreshRateUnit: '{0} second(s)/time',
selectColumn: 'Select column', selectColumn: 'Select column',
}, },
loadingText: { loadingText: {
@ -180,7 +180,7 @@ const message = {
'In order to better protect your legitimate rights and interests, please read and agree to the following agreement &laquo; <a href = "https://www.fit2cloud.com/legal/licenses.html" target = "_blank" > fly to cloud community software license agreement </a> &raquo;', 'In order to better protect your legitimate rights and interests, please read and agree to the following agreement &laquo; <a href = "https://www.fit2cloud.com/legal/licenses.html" target = "_blank" > fly to cloud community software license agreement </a> &raquo;',
}, },
rule: { rule: {
username: 'Enter an username', username: 'Enter a username',
password: 'Enter a password', password: 'Enter a password',
rePassword: 'Confirm password is inconsistent with the password.', rePassword: 'Confirm password is inconsistent with the password.',
requiredInput: 'This field is required.', requiredInput: 'This field is required.',
@ -268,7 +268,7 @@ const message = {
upgrading: 'Upgrading', upgrading: 'Upgrading',
upgradeerr: 'Upgrade Error', upgradeerr: 'Upgrade Error',
pullerr: 'Pull Image Error', pullerr: 'Pull Image Error',
rebuilding: 'ReBuilding', rebuilding: 'Rebuilding',
deny: 'Denied', deny: 'Denied',
accept: 'Accepted', accept: 'Accepted',
used: 'Used', used: 'Used',
@ -285,16 +285,16 @@ const message = {
uperr: 'Error', uperr: 'Error',
}, },
units: { units: {
second: 'second(s)', second: 'second | seconds',
minute: 'minute(s)', minute: 'minute | minutes',
hour: 'hour(s)', hour: 'hour | hours',
day: 'day(s)', day: 'day | days',
week: 'week(s)', week: 'week | weeks',
month: 'month(s)', month: 'month | months',
year: 'year(s)', year: 'year | years',
time: 'time(s)', time: 'rqm',
core: 'core(s)', core: 'core | cores',
millisecond: 'millisecond(s)', millisecond: 'millisecond | milliseconds',
secondUnit: 's', secondUnit: 's',
minuteUnit: 'min', minuteUnit: 'min',
hourUnit: 'h', hourUnit: 'h',
@ -316,27 +316,27 @@ const message = {
menu: { menu: {
home: 'Overview', home: 'Overview',
apps: 'App Store', apps: 'App Store',
website: 'Website', website: 'Website | Websites',
project: 'Project', project: 'Project | Projects',
config: 'Config', config: 'Configuration | Configurations',
ssh: 'SSH Setting', ssh: 'SSH Settings',
firewall: 'Firewall', firewall: 'Firewall',
ssl: 'Certificate', ssl: 'Certificate | Certificates',
database: 'Database', database: 'Database | Databases',
container: 'Container', container: 'Container | Containers',
cronjob: 'Cron Job', cronjob: 'Cron Job | Cron Jobs',
host: 'Host', host: 'Host | Hosts',
security: 'Security', security: 'Security',
files: 'File', files: 'File Browser',
monitor: 'Monitor', monitor: 'Monitoring',
terminal: 'Terminal', terminal: 'Terminal | Terminals',
settings: 'Setting', settings: 'Setting | Settings',
toolbox: 'Toolbox', toolbox: 'Toolbox',
logs: 'Log', logs: 'Log | Logs',
runtime: 'Runtime', runtime: 'Runtime | Runtimes',
processManage: 'Process', processManage: 'Process | Processes',
process: 'Process', process: 'Process | Processes',
network: 'Network', network: 'Network | Networks',
supervisor: 'Supervisor', supervisor: 'Supervisor',
name: 'Tamper Proof', name: 'Tamper Proof',
}, },
@ -346,45 +346,45 @@ const message = {
operationSuccess: 'Operation succeeded, rebooting, please refresh the browser manually later!', operationSuccess: 'Operation succeeded, rebooting, please refresh the browser manually later!',
overview: 'Overview', overview: 'Overview',
entranceHelper: `Security entrance isn't enabled. You can enable it in "Setting -> Security" to improve system security.`, entranceHelper: `Security entrance isn't enabled. You can enable it in "Setting -> Security" to improve system security.`,
appInstalled: 'App', appInstalled: 'Applications',
systemInfo: 'System info', systemInfo: 'System infomation',
hostname: 'Hostname', hostname: 'Hostname',
platformVersion: 'Platform version', platformVersion: 'Operating system',
kernelVersion: 'Kernel version', kernelVersion: 'Kernel',
kernelArch: 'Kernel arch', kernelArch: 'Architecture',
network: 'Network', network: 'Network',
io: 'Disk IO', io: 'Disk I/O',
ip: 'Host address', ip: 'Local IP',
proxy: 'System Proxy', proxy: 'System proxy',
baseInfo: 'Base info', baseInfo: 'Base info',
totalSend: 'Total send', totalSend: 'Total sent',
totalRecv: 'Total recv', totalRecv: 'Total received',
rwPerSecond: 'IO times', rwPerSecond: 'I/O operations',
ioDelay: 'IO delay', ioDelay: 'I/O latency',
uptime: 'Uptime', uptime: 'Up since',
runningTime: 'Running time', runningTime: 'Uptime',
mem: 'System', mem: 'System',
swapMem: 'Swap partition', swapMem: 'Swap partition',
runSmoothly: 'Run smoothly', runSmoothly: 'Run smoothly',
runNormal: 'Run normal', runNormal: 'Run normally',
runSlowly: 'Run slowly', runSlowly: 'Run slowly',
runJam: 'Run blockaged', runJam: 'Run blockaged',
core: 'Physical core', core: 'Physical core',
logicCore: 'Logic core', logicCore: 'Logic core',
loadAverage: 'Average load in the last {0} minute(s)', loadAverage: 'Load average in the last 1 minute | Load average in the last {n} minutes',
load: 'Load', load: 'Load',
mount: 'Mount point', mount: 'Mount point',
fileSystem: 'File system', fileSystem: 'File system',
total: 'Total', total: 'Total',
used: 'Used', used: 'Used',
free: 'Free', free: 'Free',
percent: 'Percent', percent: 'Utilization',
app: 'Recommended Apps', app: 'Recommended applications',
goInstall: 'Go install', goInstall: 'Go install',
networkCard: 'NetworkCard', networkCard: 'Network card',
disk: 'Disk', disk: 'Disk',
}, },
tabs: { tabs: {
@ -402,7 +402,7 @@ const message = {
}, },
database: { database: {
all: 'All', all: 'All',
manage: 'Management', manage: 'Manage database',
database: 'Database', database: 'Database',
deleteBackupHelper: 'Delete database backups simultaneously', deleteBackupHelper: 'Delete database backups simultaneously',
delete: 'Delete operation cannot be rolled back, please input "', delete: 'Delete operation cannot be rolled back, please input "',
@ -414,10 +414,10 @@ const message = {
goInstall: 'Go to install', goInstall: 'Go to install',
source: 'Source', source: 'Source',
isDelete: 'Deleted', isDelete: 'Deleted',
permission: 'Change Permission', permission: 'Change permissions',
permissionForIP: 'IP', permissionForIP: 'IP',
permissionAll: 'All of them(%)', permissionAll: 'All of them(%)',
databaseConnInfo: 'Connection info', databaseConnInfo: 'View connection info',
rootPassword: 'Root password', rootPassword: 'Root password',
serviceName: 'Service Name', serviceName: 'Service Name',
serviceNameHelper: 'Access between containers in the same network.', serviceNameHelper: 'Access between containers in the same network.',
@ -447,8 +447,9 @@ const message = {
passwordHelper: 'Unable to retrieve, please modify', passwordHelper: 'Unable to retrieve, please modify',
local: 'Local', local: 'Local',
remote: 'Remote', remote: 'Remote',
remoteDB: 'Remote database', remoteDB: 'Remote server',
createRemoteDB: 'Create remote server', manageRemoteDB: 'Manage remote servers',
createRemoteDB: 'Bind remote server',
unBindRemoteDB: 'Unbind remote server', unBindRemoteDB: 'Unbind remote server',
unBindForce: 'Force unbind', unBindForce: 'Force unbind',
unBindForceHelper: 'Ignore all errors during the unbinding process to ensure the final operation is successful', unBindForceHelper: 'Ignore all errors during the unbinding process to ensure the final operation is successful',
@ -560,8 +561,8 @@ const message = {
recoverHelper: 'This will overwrite the data with [{0}]. Do you want to continue?', recoverHelper: 'This will overwrite the data with [{0}]. Do you want to continue?',
submitIt: 'Overwrite the data', submitIt: 'Overwrite the data',
baseConf: 'Basic configuration', baseConf: 'Basic',
allConf: 'All configuration', allConf: 'All',
restartNow: 'Restart now', restartNow: 'Restart now',
restartNowHelper1: restartNowHelper1:
'You need to restart the system after the configuration changes take effect. If your data needs to be persisted, perform the save operation first.', 'You need to restart the system after the configuration changes take effect. If your data needs to be persisted, perform the save operation first.',
@ -625,7 +626,7 @@ const message = {
cleanSuccess: 'The operation is successful, the number of this cleanup: {0}!', cleanSuccess: 'The operation is successful, the number of this cleanup: {0}!',
cleanSuccessWithSpace: cleanSuccessWithSpace:
'The operation is successful. The number of disks cleaned this time is {0}. The disk space freed is {1}!', 'The operation is successful. The number of disks cleaned this time is {0}. The disk space freed is {1}!',
container: 'Container', container: 'Container | Containers',
unExposedPort: 'The current port mapping address is 127.0.0.1, which cannot enable external access.', unExposedPort: 'The current port mapping address is 127.0.0.1, which cannot enable external access.',
upTime: 'Uptime', upTime: 'Uptime',
all: 'All', all: 'All',
@ -665,7 +666,7 @@ const message = {
openStdin: 'Keep STDIN open even if not attached (-i)', openStdin: 'Keep STDIN open even if not attached (-i)',
custom: 'Custom', custom: 'Custom',
emptyUser: 'When empty, you will log in as default', emptyUser: 'When empty, you will log in as default',
containerTerminal: 'Terminal', containerTerminal: 'Open terminal',
privileged: 'Privileged', privileged: 'Privileged',
privilegedHelper: privilegedHelper:
'Allow the container to perform certain privileged operations on the host, which may increase container risks. Use with caution!', 'Allow the container to perform certain privileged operations on the host, which may increase container risks. Use with caution!',
@ -711,10 +712,10 @@ const message = {
no: 'never', no: 'never',
monitor: 'Monitor', monitor: 'Monitor',
refreshTime: 'Refresh time', refreshTime: 'Refresh interval',
cache: 'Cache', cache: 'Cache',
image: 'Image name', image: 'Image | Images',
imagePull: 'Pull', imagePull: 'Pull',
imagePush: 'Push', imagePush: 'Push',
imageDelete: 'Image delete', imageDelete: 'Image delete',
@ -744,7 +745,7 @@ const message = {
delBuildCacheHelper: `This will delete all cached artifacts that are generated during builds and can't be undone. Do you want to continue?`, delBuildCacheHelper: `This will delete all cached artifacts that are generated during builds and can't be undone. Do you want to continue?`,
urlWarning: 'The URL prefix does not need to include http:// or https://. Please modify.', urlWarning: 'The URL prefix does not need to include http:// or https://. Please modify.',
network: 'Network', network: 'Network | Networks',
networkHelper: networkHelper:
'This may cause some applications and runtime environments to not work properly. Do you want to continue?', 'This may cause some applications and runtime environments to not work properly. Do you want to continue?',
createNetwork: 'Create', createNetwork: 'Create',
@ -757,7 +758,7 @@ const message = {
gateway: 'Gateway', gateway: 'Gateway',
auxAddress: 'Exclude IP', auxAddress: 'Exclude IP',
volume: 'Volume', volume: 'Volume | Volumes',
volumeDir: 'Volume directory', volumeDir: 'Volume directory',
nfsEnable: 'Enable NFS storage', nfsEnable: 'Enable NFS storage',
nfsAddress: 'Address', nfsAddress: 'Address',
@ -766,13 +767,13 @@ const message = {
options: 'Options', options: 'Options',
createVolume: 'Create', createVolume: 'Create',
repo: 'Container registry', repo: 'Container registry | Container registries',
createRepo: 'Add', createRepo: 'Add',
httpRepo: 'Choosing HTTP protocol requires restarting the Docker service to add it into insecure registries.', httpRepo: 'Choosing HTTP protocol requires restarting the Docker service to add it into insecure registries.',
delInsecure: 'Deletion of credit', delInsecure: 'Deletion of credit',
delInsecureHelper: delInsecureHelper:
'This will restart Docker service to remove it from insecure registries. Do you want to continue?', 'This will restart Docker service to remove it from insecure registries. Do you want to continue?',
downloadUrl: 'Registry server', downloadUrl: 'Server',
imageRepo: 'Image repo', imageRepo: 'Image repo',
repoHelper: 'Does it include a mirror repository/organization/project?', repoHelper: 'Does it include a mirror repository/organization/project?',
auth: 'Require authentication', auth: 'Require authentication',
@ -781,7 +782,7 @@ const message = {
registrieHelper: registrieHelper:
'If multiple private repositories exist, newlines must be displayed, for example:\n172.16.10.111:8081 \n172.16.10.112:8081', 'If multiple private repositories exist, newlines must be displayed, for example:\n172.16.10.111:8081 \n172.16.10.112:8081',
compose: 'Compose', compose: 'Compose | Composes',
fromChangeHelper: 'Switching the source will clean the current edited content. Do you want to continue?', fromChangeHelper: 'Switching the source will clean the current edited content. Do you want to continue?',
composePathHelper: 'Configuration file save path: {0}', composePathHelper: 'Configuration file save path: {0}',
composeHelper: composeHelper:
@ -791,12 +792,12 @@ const message = {
deleteComposeHelper: deleteComposeHelper:
'Delete all files related to container compose, including configuration files and persistent files. Please proceed with caution!', 'Delete all files related to container compose, including configuration files and persistent files. Please proceed with caution!',
deleteCompose: '" Delete this composition.', deleteCompose: '" Delete this composition.',
apps: 'Apps', apps: 'App Store',
local: 'Local', local: 'Local',
createCompose: 'Create', createCompose: 'Create',
composeDirectory: 'Compose directory', composeDirectory: 'Compose directory',
template: 'Template', template: 'Template',
composeTemplate: 'Compose template', composeTemplate: 'Compose template | Compose templates',
createComposeTemplate: 'Create', createComposeTemplate: 'Create',
description: 'Description', description: 'Description',
content: 'Content', content: 'Content',
@ -813,7 +814,7 @@ const message = {
composeDownHelper: composeDownHelper:
'This will stop and remove all containers and networks under the {0} compose. Do you want to continue?', 'This will stop and remove all containers and networks under the {0} compose. Do you want to continue?',
setting: 'Setting', setting: 'Setting | Settings',
operatorStatusHelper: 'This will "{0}" Docker service. Do you want to continue?', operatorStatusHelper: 'This will "{0}" Docker service. Do you want to continue?',
dockerStatus: 'Docker Service', dockerStatus: 'Docker Service',
daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.', daemonJsonPathHelper: 'Ensure that the configuration path is the same as that specified in docker.service.',
@ -851,7 +852,7 @@ const message = {
'Saving the Socket Path setting may result in Docker service being unavailable. Do you want to continue?', 'Saving the Socket Path setting may result in Docker service being unavailable. Do you want to continue?',
sockPathErr: 'Please select or enter the correct Docker sock file path', sockPathErr: 'Please select or enter the correct Docker sock file path',
related: 'Related', related: 'Related',
includeAppstore: 'Show app store container', includeAppstore: 'Show containers from the app store',
cleanDockerDiskZone: 'Clean up disk space used by Docker', cleanDockerDiskZone: 'Clean up disk space used by Docker',
cleanImagesHelper: '( Clean up all images that are not used by any containers )', cleanImagesHelper: '( Clean up all images that are not used by any containers )',
@ -866,9 +867,9 @@ const message = {
ifMakeImageWithContainer: 'Create New Image from This Container?', ifMakeImageWithContainer: 'Create New Image from This Container?',
}, },
cronjob: { cronjob: {
create: 'Create Cron Job', create: 'Create cron job',
edit: 'Edit Cron Job', edit: 'Edit cron job',
cronTask: 'Cron Job', cronTask: 'Cron Job | Cron Jobs',
changeStatus: 'Change status', changeStatus: 'Change status',
disableMsg: 'This will stop the scheduled task from automatically executing. Do you want to continue?', disableMsg: 'This will stop the scheduled task from automatically executing. Do you want to continue?',
enableMsg: 'This will allow the scheduled task to automatically execute. Do you want to continue?', enableMsg: 'This will allow the scheduled task to automatically execute. Do you want to continue?',
@ -954,20 +955,20 @@ const message = {
alertTitle: 'Planned Task - {0} {1} Task Failure Alert', alertTitle: 'Planned Task - {0} {1} Task Failure Alert',
}, },
monitor: { monitor: {
monitor: 'Monitor', monitor: 'Monitoring',
globalFilter: 'Global Filter', globalFilter: 'Global Filter',
enableMonitor: 'Enable', enableMonitor: 'Enable',
storeDays: 'Expiration days', storeDays: 'Expiration days',
cleanMonitor: 'Clean monitoring records', cleanMonitor: 'Clean monitoring records',
avgLoad: 'Average load', avgLoad: 'Load average',
loadDetail: 'Load detail', loadDetail: 'Load detail',
resourceUsage: 'Resource utilization rate', resourceUsage: 'Utilization',
networkCard: 'NetworkCard', networkCard: 'Network interface',
read: 'Read', read: 'Read',
write: 'Write', write: 'Write',
readWriteCount: 'Read or write times', readWriteCount: 'I/O operations',
readWriteTime: 'Read or write delay', readWriteTime: 'I/O latency',
today: 'Today', today: 'Today',
yesterday: 'Yesterday', yesterday: 'Yesterday',
lastNDay: 'Last {0} day(s)', lastNDay: 'Last {0} day(s)',
@ -988,29 +989,31 @@ const message = {
}, },
terminal: { terminal: {
conn: 'connection', conn: 'connection',
connLocalErr: 'Unable to automatically authenticate, please fill in the local server login information!', connLocalErr: 'Unable to automatically authenticate, please fill in the local server login information.',
testConn: 'Test connection', testConn: 'Test connection',
saveAndConn: 'Save and connect', saveAndConn: 'Save and connect',
connTestOk: 'Connection information available', connTestOk: 'Connection information available',
connTestFailed: 'Connection unavailable, please check connection information!', connTestFailed: 'Connection unavailable, please check connection information.',
host: 'Host', host: 'Host | Hosts',
createConn: 'New connection', createConn: 'New connection',
group: 'Group', group: 'Group',
manageGroup: 'Manage groups',
noHost: 'No host', noHost: 'No host',
groupChange: 'Change group', groupChange: 'Change group',
expand: 'Expand all', expand: 'Expand all',
fold: 'All contract', fold: 'All contract',
batchInput: 'Batch input', batchInput: 'Batch processing',
quickCommand: 'Quick command', quickCommand: 'Quick command | Quick commands',
quickCommandHelper: 'Frequently used command list for quick selection at the bottom of the terminal interface', // quickCommandHelper: 'Frequently used command list for quick selection at the bottom of the terminal interface.',
quickCommandHelper: 'You can use the quick commands at the bottom of the "Terminals -> Terminals".',
groupDeleteHelper: groupDeleteHelper:
'After the group is removed, all connections in the group will be migrated to the default group. Do you want to continue?', 'After the group is removed, all connections in the group will be migrated to the default group. Do you want to continue?',
command: 'Command', command: 'Command',
quickCmd: 'Quick command', quickCmd: 'Quick command',
addHost: 'Add host', addHost: 'Add',
localhost: 'Localhost', localhost: 'Localhost',
ip: 'Address', ip: 'Address',
authMode: 'Auth mode', authMode: 'Authentication',
passwordMode: 'Password', passwordMode: 'Password',
rememberPassword: 'Remember authentication information', rememberPassword: 'Remember authentication information',
keyMode: 'PrivateKey', keyMode: 'PrivateKey',
@ -1038,23 +1041,21 @@ const message = {
swapOff: 'The minimum partition size is 40 KB. Setting it to 0 will disable the Swap partition.', swapOff: 'The minimum partition size is 40 KB. Setting it to 0 will disable the Swap partition.',
}, },
device: { device: {
dnsHelper: 'Server Address Domain Resolution', dnsHelper: 'DNS server',
dnsAlert: dnsAlert:
'Attention! Modifying the configuration of /etc/resolv.conf file will restore the file to its default values after system restart.', 'Attention! Modifying the configuration of /etc/resolv.conf file will restore the file to its default values after system restart.',
dnsHelper1: dnsHelper1:
'When there are multiple DNS entries, they should be displayed on new lines. e.g.\n114.114.114.114\n8.8.8.8', 'When there are multiple DNS entries, they should be displayed on new lines. e.g.\n114.114.114.114\n8.8.8.8',
hostsHelper: 'Hostname Resolution', hostsHelper: 'Hostname resolution',
hosts: 'Domain', hosts: 'Domain',
hostAlert: 'Hidden commented records, please click the All configuration button to view or set', hostAlert: 'Hidden commented records, please click the All configuration button to view or set',
toolbox: 'Quick setup', toolbox: 'Quick settings',
hostname: 'Hostname', hostname: 'Hostname',
passwd: 'System password', passwd: 'System password',
passwdHelper: 'Input characters cannot include $ and &', passwdHelper: 'Input characters cannot include $ and &',
timeZone: 'System time zone', timeZone: 'System time zone',
localTime: 'Server time', localTime: 'Server time',
timeZoneChangeHelper: 'Modifying the system time zone requires restarting the service. Continue?', timeZoneChangeHelper: 'Modifying the system time zone requires restarting the service. Continue?',
// timeZoneHelper:
// 'Time zone modification depends on the timedatectl command. If not installed, the modification may fail.',
timeZoneHelper: `If you don't install "timedatectl" command, you may not change the time zone. Because system uses that command to change time zone.`, timeZoneHelper: `If you don't install "timedatectl" command, you may not change the time zone. Because system uses that command to change time zone.`,
timeZoneCN: 'Beijing', timeZoneCN: 'Beijing',
timeZoneAM: 'Los Angeles', timeZoneAM: 'Los Angeles',
@ -1062,12 +1063,9 @@ const message = {
ntpALi: 'Alibaba', ntpALi: 'Alibaba',
ntpGoogle: 'Google', ntpGoogle: 'Google',
syncSite: 'NTP server', syncSite: 'NTP server',
hostnameHelper: hostnameHelper: `Hostname modification depends on the "hostnamectl" command. If the command isn't installed, the modification may fail.`,
'Hostname modification depends on the hostnamectl command. If not installed, the modification may fail.', userHelper: `The username depends on the "whoami" command for retrieval. If the command isn't installed, retrieval may fail.`,
userHelper: passwordHelper: `Password modification depends on the "chpasswd" command. If the command isn't installed, the modification may fail.`,
'The username depends on the whoami command for retrieval. If not installed, retrieval may fail.',
passwordHelper:
'Password modification depends on the chpasswd command. If not installed, the modification may fail.',
hostHelper: hostHelper:
'There is an empty value in the provided content. Please check and try again after modification!', 'There is an empty value in the provided content. Please check and try again after modification!',
dnsCheck: 'Test Availability', dnsCheck: 'Test Availability',
@ -1188,29 +1186,32 @@ const message = {
file: { file: {
dir: 'Folder', dir: 'Folder',
upload: 'Upload', upload: 'Upload',
uploadFile: '@:file.upload @.lower:file.file',
uploadDirectory: '@:file.upload @.lower:file.dir',
download: 'Download', download: 'Download',
fileName: 'File name', fileName: 'File name',
search: 'Search', search: 'Search',
mode: 'Permissions', mode: 'Permissions',
editPermissions: 'Edit @.lower:file.mode',
owner: 'Owner', owner: 'Owner',
file: 'File', file: 'File',
remoteFile: 'Remote download', remoteFile: 'Download from remote',
share: 'Share', share: 'Share',
sync: 'Data Synchronization', sync: 'Data Synchronization',
size: 'Size', size: 'Size',
updateTime: 'Modification time', updateTime: 'Modified',
open: 'Open', open: 'Open',
rename: 'Rename', rename: 'Rename',
role: 'Permissions', role: 'Permissions',
info: 'Attribute', info: 'View attributes',
linkFile: 'Soft link', linkFile: 'Soft link',
terminal: 'Terminal', terminal: 'Open terminal',
batchoperation: 'batch operation', batchoperation: 'batch operation',
shareList: 'Share list', shareList: 'Share list',
zip: 'Compressed', zip: 'Compressed',
group: 'Group', group: 'Group',
path: 'Path', path: 'Path',
public: 'Public', public: 'Others',
setRole: 'Set permissions', setRole: 'Set permissions',
link: 'File link', link: 'File link',
rRole: 'Read', rRole: 'Read',
@ -1230,29 +1231,29 @@ const message = {
hardLink: 'Hard link', hardLink: 'Hard link',
linkPath: 'Link path', linkPath: 'Link path',
selectFile: 'Select file', selectFile: 'Select file',
downloadUrl: 'Download URL', downloadUrl: 'Remote URL',
downloadStart: 'Download start!', downloadStart: 'Download started',
moveSuccess: 'Move success', moveSuccess: 'Successfully moved',
copySuccess: 'Copy success', copySuccess: 'Successfully copied',
move: 'Move', move: 'Move',
copy: 'Copy', copy: 'Copy',
calculate: 'Calculate', calculate: 'Calculate',
canNotDeCompress: 'Cannot decompress this file', canNotDeCompress: 'Cannot decompress this file',
uploadSuccess: 'Upload successful!', uploadSuccess: 'Successfully upload',
downloadProcess: 'Download progress', downloadProcess: 'Download progress',
downloading: 'Downloading...', downloading: 'Downloading...',
infoDetail: 'File Properties', infoDetail: 'File properties',
list: 'File List', list: 'File list',
sub: 'Include subdirectory', sub: 'Include subdirectories',
downloadSuccess: 'Download Success', downloadSuccess: 'Successfully downloaded',
theme: 'Theme', theme: 'Theme',
language: 'Language', language: 'Language',
eol: 'End of line', eol: 'End of line',
copyDir: 'Copy Dir', copyDir: 'Copy',
paste: 'Paste', paste: 'Paste',
cancel: 'Cancel', cancel: 'Cancel',
changeOwner: 'Modify user and user group', changeOwner: 'Modify user and user group',
containSub: 'Modify sub-file attributes at the same time', containSub: 'Apply the permission change recursively',
ownerHelper: ownerHelper:
'The default user of the PHP operating environment: the user group is 1000:1000, it is normal that the users inside and outside the container show inconsistencies', 'The default user of the PHP operating environment: the user group is 1000:1000, it is normal that the users inside and outside the container show inconsistencies',
searchHelper: 'Support wildcards such as *', searchHelper: 'Support wildcards such as *',
@ -1262,7 +1263,7 @@ const message = {
unsupportedType: 'Unsupported file type', unsupportedType: 'Unsupported file type',
deleteHelper: deleteHelper:
'Are you sure you want to delete the following files? By default, it will enter the recycle bin after deletion', 'Are you sure you want to delete the following files? By default, it will enter the recycle bin after deletion',
fileHeper: 'Note: 1. Search results do not support sorting. 2. Folders cannot be sorted by size.', fileHeper: `Note:\n1. Search results can't be sorted.\n2. Folders can't be sorted by size.`,
forceDeleteHelper: 'Permanently delete the file (without entering the recycle bin, delete it directly)', forceDeleteHelper: 'Permanently delete the file (without entering the recycle bin, delete it directly)',
recycleBin: 'Recycle bin', recycleBin: 'Recycle bin',
sourcePath: 'Original path', sourcePath: 'Original path',
@ -1286,13 +1287,13 @@ const message = {
wordWrap: 'Automatically wrap', wordWrap: 'Automatically wrap',
deleteHelper2: deleteHelper2:
'Are you sure you want to delete the selected file? The deletion operation cannot be rolled back', 'Are you sure you want to delete the selected file? The deletion operation cannot be rolled back',
ignoreCertificate: 'Ignore Certificate', ignoreCertificate: 'Allow insecure server connections',
ignoreCertificateHelper: ignoreCertificateHelper:
'Ignoring untrusted certificates during downloads may lead to data leakage or tampering. Please use this option with caution, only when trusting the download source.', 'Allowing inscure server connections may lead to data leak or tampering. Use this option only when trusting the download source.',
uploadOverLimit: 'The number of files exceeds 1000! Please compress and upload', uploadOverLimit: 'The number of files exceeds 1000! Please compress and upload',
clashDitNotSupport: 'File names are prohibited from containing .1panel_clash', clashDitNotSupport: 'File names are prohibited from containing .1panel_clash',
clashDeleteAlert: `The "Recycle Bin" folder can't be deleted`, clashDeleteAlert: `The "Recycle Bin" folder can't be deleted`,
clashOpenAlert: 'Please click the [Recycle Bin] button to open the recycle bin directory', clashOpenAlert: 'Please click the "Recycle Bin" button to open the recycle bin directory',
right: 'Forward', right: 'Forward',
back: 'Back', back: 'Back',
top: 'Go Back', top: 'Go Back',
@ -1364,7 +1365,7 @@ const message = {
belong: 'Belong', belong: 'Belong',
local: 'Local', local: 'Local',
config: 'Configuration', config: 'Configuration',
session: 'Session', session: 'Session | Sessions',
loginTime: 'Login time', loginTime: 'Login time',
loginIP: 'Login IP', loginIP: 'Login IP',
disconnect: 'Disconnect', disconnect: 'Disconnect',
@ -1447,7 +1448,7 @@ const message = {
syncSite: 'Ntp Server', syncSite: 'Ntp Server',
syncSiteHelper: syncSiteHelper:
'This operation will use {0} as the source for system time synchronization. Do you want to continue?', 'This operation will use {0} as the source for system time synchronization. Do you want to continue?',
changePassword: 'Password change', changePassword: 'Change Password',
oldPassword: 'Original password', oldPassword: 'Original password',
newPassword: 'New password', newPassword: 'New password',
retryPassword: 'Confirm password', retryPassword: 'Confirm password',
@ -1456,8 +1457,8 @@ const message = {
diskClean: 'Cache clean', diskClean: 'Cache clean',
developerMode: 'Preview Program', developerMode: 'Preview Program',
developerModeHelper: `You will get to expirence new features and fixes before they're released broadly and give early feedback.`, developerModeHelper: `You will get to expirence new features and fixes before they're released broadly and give early feedback.`,
thirdParty: 'Third-party account', thirdParty: 'Third-party accounts',
createBackupAccount: 'Add {0}', addBackupAccount: 'Add {0}',
noTypeForCreate: 'No backup type is currently created', noTypeForCreate: 'No backup type is currently created',
LOCAL: 'Server disk', LOCAL: 'Server disk',
OSS: 'Ali OSS', OSS: 'Ali OSS',
@ -1522,7 +1523,7 @@ const message = {
backupAlert: backupAlert:
'If a cloud provider is compatible with the S3 protocol, you can directly use Amazon S3 for backup. ', 'If a cloud provider is compatible with the S3 protocol, you can directly use Amazon S3 for backup. ',
domain: 'Accelerate domain', domain: 'Accelerate domain',
backupAccount: 'Backup account', backupAccount: 'Backup account | Backup accounts',
loadBucket: 'Get bucket', loadBucket: 'Get bucket',
accountName: 'Account name', accountName: 'Account name',
accountKey: 'Account key', accountKey: 'Account key',
@ -1611,7 +1612,7 @@ const message = {
selfSigned: 'Self signed', selfSigned: 'Self signed',
selfSignedHelper: `Browsers may not trust self-signed certificates and may display security warnings.`, selfSignedHelper: `Browsers may not trust self-signed certificates and may display security warnings.`,
select: 'Select', select: 'Select',
domainOrIP: 'Domain or IP', domainOrIP: 'Domain or IP:',
timeOut: 'Timeout', timeOut: 'Timeout',
rootCrtDownload: 'Root certificate download', rootCrtDownload: 'Root certificate download',
primaryKey: 'Primary key', primaryKey: 'Primary key',
@ -1619,11 +1620,12 @@ const message = {
backupJump: backupJump:
'Backup files not in the current backup list, please try downloading from the file directory and importing for backup.', 'Backup files not in the current backup list, please try downloading from the file directory and importing for backup.',
snapshot: 'Snapshot', snapshot: 'Snapshot | Snaphshots',
deleteHelper: deleteHelper:
'All snapshot files including those in the third-party backup account will be deleted. Do you want to continue?', 'All snapshot files including those in the third-party backup account will be deleted. Do you want to continue?',
status: 'Snapshot status', status: 'Snapshot status',
ignoreRule: 'Ignore rule', ignoreRule: 'Ignore rule',
editIgnoreRule: '@:commons.button.edit @.lower:setting.ignoreRule',
ignoreHelper: ignoreHelper:
'This rule will be used to compress and backup the 1Panel data directory during creating snapshot. By default, socket files are ignored.', 'This rule will be used to compress and backup the 1Panel data directory during creating snapshot. By default, socket files are ignored.',
ignoreHelper1: 'One per line. For example,\n*.log\n/opt/1panel/cache', ignoreHelper1: 'One per line. For example,\n*.log\n/opt/1panel/cache',
@ -1668,16 +1670,16 @@ const message = {
upgradeNotes: 'Release note', upgradeNotes: 'Release note',
upgradeNow: 'Upgrade now', upgradeNow: 'Upgrade now',
source: 'Download source', source: 'Download source',
hasNewVersion: 'New version Available', hasNewVersion: 'New version available',
about: 'About', about: 'About',
project: 'Project Address', project: 'GitHub',
issue: 'Feedback', issue: 'Feedback',
doc: 'Official document', doc: 'Official document',
star: 'Star', star: 'Star',
description: 'Linux Server Panel', description: 'Linux Server Panel',
forum: 'Forum', forum: 'Discussions',
doc2: 'User Manual', doc2: 'Docs',
currentVersion: 'Version', currentVersion: 'Version',
license: 'License', license: 'License',
@ -1742,7 +1744,7 @@ const message = {
reScan: 'Rescan', reScan: 'Rescan',
cleanHelper: `This will clean up the selected system junk files and can't be undone. Do you want to continue?`, cleanHelper: `This will clean up the selected system junk files and can't be undone. Do you want to continue?`,
statusSuggest: '(Recommended Cleaning)', statusSuggest: '(Recommended Cleaning)',
statusClean: '(Very Clean)', statusClean: '(Very clean)',
statusEmpty: 'Very clean, no cleaning needed!', statusEmpty: 'Very clean, no cleaning needed!',
statusWarning: '(Proceed with Caution)', statusWarning: '(Proceed with Caution)',
lastCleanTime: 'Last Cleaned: {0}', lastCleanTime: 'Last Cleaned: {0}',
@ -1753,7 +1755,7 @@ const message = {
totalScan: 'Total junk files to be cleaned: ', totalScan: 'Total junk files to be cleaned: ',
selectScan: 'Total selected junk files: ', selectScan: 'Total selected junk files: ',
system: 'System Junk', system: 'System Junk Files',
systemHelper: systemHelper:
'Temporary files generated during snapshots, upgrades, and obsolete file contents during version iterations', 'Temporary files generated during snapshots, upgrades, and obsolete file contents during version iterations',
panelOriginal: 'System snapshot recovery backup files', panelOriginal: 'System snapshot recovery backup files',
@ -1795,7 +1797,7 @@ const message = {
buildCache: 'Container Build Cache', buildCache: 'Container Build Cache',
}, },
app: { app: {
app: 'Application', app: 'Application | Applications',
installName: 'Name', installName: 'Name',
installed: 'Installed', installed: 'Installed',
all: 'All', all: 'All',
@ -1846,8 +1848,8 @@ const message = {
deleteDB: 'Delete database', deleteDB: 'Delete database',
deleteDBHelper: 'Also delete the database', deleteDBHelper: 'Also delete the database',
noService: 'No {0}', noService: 'No {0}',
toInstall: 'to install', toInstall: 'Go to install',
param: 'Parameters configuration', param: 'Parameters',
alreadyRun: 'Age', alreadyRun: 'Age',
syncAppList: 'Sync', syncAppList: 'Sync',
less1Minute: 'Less than 1 minute', less1Minute: 'Less than 1 minute',
@ -1856,7 +1858,7 @@ const message = {
document: 'Document', document: 'Document',
updatePrompt: 'No updates available', updatePrompt: 'No updates available',
installPrompt: 'No apps installed yet', installPrompt: 'No apps installed yet',
updateHelper: 'Updating parameters may cause the application to fail to start, please operate with caution', updateHelper: 'Editing parameters may cause the application to fail to start. Please proceed with caution.',
updateWarn: 'Update parameters need to rebuild the application, Do you want to continue? ', updateWarn: 'Update parameters need to rebuild the application, Do you want to continue? ',
busPort: 'Service Port', busPort: 'Service Port',
syncStart: 'Start syncing! Please refresh the app store later', syncStart: 'Start syncing! Please refresh the app store later',
@ -1874,7 +1876,7 @@ const message = {
composeNullErr: 'compose cannot be empty', composeNullErr: 'compose cannot be empty',
takeDown: 'TakeDown', takeDown: 'TakeDown',
allReadyInstalled: 'Installed', allReadyInstalled: 'Installed',
installHelper: 'Configure image acceleration if you have image pull issues.', installHelper: 'If you have image pull issues, configure image acceleration.',
upgradeHelper: upgradeHelper:
'Bring abnormal applications back to normal status before upgrading. If the upgrade fails, go to "Log" > "System Logs" to check the failure reason.', 'Bring abnormal applications back to normal status before upgrading. If the upgrade fails, go to "Log" > "System Logs" to check the failure reason.',
installWarn: `External access has not been enabled, which prevents the application from being accessible via external networks. Do you want to continue?`, installWarn: `External access has not been enabled, which prevents the application from being accessible via external networks. Do you want to continue?`,
@ -1886,15 +1888,14 @@ const message = {
backupAppHelper: backupAppHelper:
'If the upgrade fails, the backup will be automatically rolled back. Please check the failure reason in the log audit-system log. The backup will retain the latest 3 copies by default', 'If the upgrade fails, the backup will be automatically rolled back. Please check the failure reason in the log audit-system log. The backup will retain the latest 3 copies by default',
delete: 'Delete', delete: 'Delete',
openrestyDeleteHelper: openrestyDeleteHelper: 'Forced delete of OpenResty will delete all websites. Do you want to continue?',
'Forcibly deleting OpenResty will delete all websites, please confirm the risk before operation',
downloadLogHelper1: 'All logs of {0} application are about to be downloaded. Do you want to continue? ', downloadLogHelper1: 'All logs of {0} application are about to be downloaded. Do you want to continue? ',
downloadLogHelper2: downloadLogHelper2:
'The latest {1} logs of {0} application are about to be downloaded. Do you want to continue? ', 'The latest {1} logs of {0} application are about to be downloaded. Do you want to continue? ',
syncAllAppHelper: 'All applications will be synchronized. Do you want to continue? ', syncAllAppHelper: 'All applications will be synchronized. Do you want to continue? ',
hostModeHelper: hostModeHelper:
'The current application network mode is host mode. If you need to open the port, please open it manually on the firewall page.', 'The current application network mode is host mode. If you need to open the port, please open it manually on the firewall page.',
showLocal: 'Show Local Application', showLocal: 'Show local applications',
reload: 'Reload', reload: 'Reload',
upgradeWarn: upgradeWarn:
'Upgrading the application will replace the docker-compose.yml file. If there are any changes, you can click to view the file comparison', 'Upgrading the application will replace the docker-compose.yml file. If there are any changes, you can click to view the file comparison',
@ -1912,7 +1913,7 @@ const message = {
pullImageHelper: 'Execute docker pull to pull the image before the application starts', pullImageHelper: 'Execute docker pull to pull the image before the application starts',
}, },
website: { website: {
website: 'Website', website: 'Website | Websites',
primaryDomain: 'Primary domain', primaryDomain: 'Primary domain',
otherDomains: 'Other domains', otherDomains: 'Other domains',
static: 'Static', static: 'Static',
@ -1928,6 +1929,7 @@ const message = {
'After creating a website, a corresponding FTP account will be created and the FTP directory will link to the website directory.', 'After creating a website, a corresponding FTP account will be created and the FTP directory will link to the website directory.',
remark: 'Remark', remark: 'Remark',
group: 'Group', group: 'Group',
manageGroup: 'Manage groups',
groupSetting: 'Group Management', groupSetting: 'Group Management',
createGroup: 'Create group', createGroup: 'Create group',
app: 'Application', app: 'Application',
@ -1946,7 +1948,7 @@ const message = {
perserverHelper: 'Limit the maximum concurrency of the current site', perserverHelper: 'Limit the maximum concurrency of the current site',
perip: 'Single IP', perip: 'Single IP',
peripHelper: 'Limit the maximum number of concurrent access to a single IP', peripHelper: 'Limit the maximum number of concurrent access to a single IP',
rate: 'Flow limit', rate: 'Traffic limits',
rateHelper: 'Limit the flow of each request (unit: KB)', rateHelper: 'Limit the flow of each request (unit: KB)',
limitHelper: 'Enable flow control', limitHelper: 'Enable flow control',
other: 'Other', other: 'Other',
@ -1960,7 +1962,7 @@ const message = {
manual: 'Manual parsing', manual: 'Manual parsing',
key: 'Key', key: 'Key',
check: 'View', check: 'View',
acmeAccountManage: 'ACME accounts', acmeAccountManage: 'Manage ACME accounts',
email: 'Email', email: 'Email',
acmeAccount: 'ACME account', acmeAccount: 'ACME account',
provider: 'Verification method', provider: 'Verification method',
@ -1969,23 +1971,23 @@ const message = {
brand: 'Organization', brand: 'Organization',
deploySSL: 'Deployment', deploySSL: 'Deployment',
deploySSLHelper: 'Are you sure to deploy the certificate? ', deploySSLHelper: 'Are you sure to deploy the certificate? ',
ssl: 'Certificate', ssl: 'Certificate | Certificates',
dnsAccountManage: 'DNS providers', dnsAccountManage: 'Manage DNS providers',
renewSSL: 'Renew', renewSSL: 'Renew',
renewHelper: 'Are you sure to renew the certificate? ', renewHelper: 'Are you sure to renew the certificate? ',
renewSuccess: 'Renew Certificate', renewSuccess: 'Renew certificate',
config: 'Configuration', config: 'Edit',
enableHTTPS: 'Enable', enableHTTPS: 'Enable',
aliasHelper: 'Alias is the directory name of the website', aliasHelper: 'Alias is the directory name of the website',
lastBackupAt: 'last backup time', lastBackupAt: 'last backup time',
null: 'none', null: 'none',
nginxConfig: 'Nginx configuration', nginxConfig: 'Nginx configuration',
websiteConfig: 'Website Settings', websiteConfig: 'Website settings',
basic: 'Basic', basic: 'Basic',
source: 'Configuration', source: 'Configuration source',
security: 'Security', security: 'Security',
log: 'Log', log: 'Logs',
nginxPer: 'Performance Tuning', nginxPer: 'Performance tuning',
neverExpire: 'Never', neverExpire: 'Never',
setDefault: 'Set as default', setDefault: 'Set as default',
default: 'Default', default: 'Default',
@ -2017,8 +2019,8 @@ const message = {
doorSite: 'Portal', doorSite: 'Portal',
qiteSite: 'Enterprise', qiteSite: 'Enterprise',
videoSite: 'Video', videoSite: 'Video',
errLog: 'Error logs', errLog: 'Error log',
accessLog: 'Website Logs', accessLog: 'Website log',
stopHelper: stopHelper:
'After stopping the site, it will not be able to access normally, and the user will display the stop page of the current site when visiting. Do you want to continue? ', 'After stopping the site, it will not be able to access normally, and the user will display the stop page of the current site when visiting. Do you want to continue? ',
startHelper: startHelper:
@ -2029,7 +2031,7 @@ const message = {
folderTitle: 'The website mainly contains the following folders', folderTitle: 'The website mainly contains the following folders',
wafFolder: 'Firewall rules', wafFolder: 'Firewall rules',
indexFolder: 'Website root directory', indexFolder: 'Website root directory',
logFolder: 'Website logs', logFolder: 'Website log',
sslFolder: 'Website Certificate', sslFolder: 'Website Certificate',
enableOrNot: 'Enable', enableOrNot: 'Enable',
oldSSL: 'Existing certificate', oldSSL: 'Existing certificate',
@ -2039,9 +2041,9 @@ const message = {
privateKey: 'Key (KEY)', privateKey: 'Key (KEY)',
certificate: 'Certificate (PEM format)', certificate: 'Certificate (PEM format)',
HTTPConfig: 'HTTP Options', HTTPConfig: 'HTTP Options',
HTTPSOnly: 'Disable HTTP', HTTPSOnly: 'Block HTTP requests',
HTTPToHTTPS: 'Access HTTP automatically jumps to HTTPS', HTTPToHTTPS: 'Redirect to HTTPS',
HTTPAlso: 'HTTP can be accessed directly', HTTPAlso: 'Allow direct HTTP requests',
sslConfig: 'SSL options', sslConfig: 'SSL options',
disableHTTPS: 'Disable HTTPS', disableHTTPS: 'Disable HTTPS',
disableHTTPSHelper: disableHTTPSHelper:
@ -2062,7 +2064,7 @@ const message = {
ever: 'permanent', ever: 'permanent',
nextYear: 'One year later', nextYear: 'One year later',
noLog: 'There are currently no logs...', noLog: 'There are currently no logs...',
defaultServer: 'Default site', defaultServer: 'Set default site',
noDefaultServer: 'Not set', noDefaultServer: 'Not set',
defaultServerHelper: defaultServerHelper:
'After setting the default site, all unbound domain names and IPs are directed to the default site\n which can effectively prevent malicious analysis', 'After setting the default site, all unbound domain names and IPs are directed to the default site\n which can effectively prevent malicious analysis',
@ -2168,7 +2170,7 @@ const message = {
'Only supports importing local backups, importing backups from other machines may cause recovery failure', 'Only supports importing local backups, importing backups from other machines may cause recovery failure',
ipWebsiteWarn: 'Websites with IP as domain names need to be set as default site to be accessed normally.', ipWebsiteWarn: 'Websites with IP as domain names need to be set as default site to be accessed normally.',
hstsHelper: 'Enabling HSTS can increase website security', hstsHelper: 'Enabling HSTS can increase website security',
defaultHtml: 'Default page', defaultHtml: 'Set default page',
website404: 'Website 404 error page', website404: 'Website 404 error page',
domain404: 'Website domain does not exist', domain404: 'Website domain does not exist',
indexHtml: 'Index for static website', indexHtml: 'Index for static website',
@ -2200,7 +2202,7 @@ const message = {
uploadMaxSize: 'Upload limit', uploadMaxSize: 'Upload limit',
indexHelper: indexHelper:
'In order to ensure the normal operation of the PHP website, please place the code in the index directory and avoid renaming', 'In order to ensure the normal operation of the PHP website, please place the code in the index directory and avoid renaming',
extensions: 'Extension template', extensions: 'Manage extension templates',
extension: 'Extension', extension: 'Extension',
extensionHelper: 'Please use multiple extensions, split', extensionHelper: 'Please use multiple extensions, split',
toExtensionsList: 'View extension list', toExtensionsList: 'View extension list',
@ -2256,8 +2258,8 @@ const message = {
apply: 'Renew', apply: 'Renew',
applyStart: 'Certificate application starts', applyStart: 'Certificate application starts',
getDnsResolve: 'Getting DNS resolution value, please wait...', getDnsResolve: 'Getting DNS resolution value, please wait...',
selfSigned: 'Self-signed certificates', selfSigned: 'Manage Self-signed CA',
ca: 'Certificate Authority', ca: 'Certificate authority',
commonName: 'Common name', commonName: 'Common name',
caName: 'Certificate authority name', caName: 'Certificate authority name',
company: 'Organization name', company: 'Organization name',
@ -2274,7 +2276,7 @@ const message = {
pushDirHelper: pushDirHelper:
'Certificate file "fullchain.pem" and key file "privkey.pem" will be generated in this directory.', 'Certificate file "fullchain.pem" and key file "privkey.pem" will be generated in this directory.',
organizationDetail: 'Organization details', organizationDetail: 'Organization details',
fromWebsite: 'From websites', fromWebsite: 'From website',
dnsMauanlHelper: dnsMauanlHelper:
'In manual resolution mode, you need to click the apply button after creation to obtain the DNS resolution value', 'In manual resolution mode, you need to click the apply button after creation to obtain the DNS resolution value',
httpHelper: 'HTTP mode requires OpenResty to be installed', httpHelper: 'HTTP mode requires OpenResty to be installed',
@ -2358,9 +2360,12 @@ const message = {
addressHelper1: 'Support IP address or IP range. For example, "172.16.10.11" or "172.16.10.0/24".', addressHelper1: 'Support IP address or IP range. For example, "172.16.10.11" or "172.16.10.0/24".',
addressHelper2: 'For multiple IP addresses, separate with comma. For example, "172.16.10.11, 172.16.0.0/24".', addressHelper2: 'For multiple IP addresses, separate with comma. For example, "172.16.10.11, 172.16.0.0/24".',
allIP: 'All IP', allIP: 'All IP',
portRule: 'Port rule', portRule: 'Rule | Rules',
forwardRule: 'Forwarding', createPortRule: '@:commons.button.create @.lower:firewall.portRule',
ipRule: 'IP rule', forwardRule: 'Port-Forward rule | Port-Forward rules',
createForwardRule: '@:commons.button.create @:firewall.forwardRule',
ipRule: 'IP rule | IP rules',
createIpRule: '@:commons.button.create @:firewall.ipRule',
userAgent: 'User-Agent filter', userAgent: 'User-Agent filter',
sourcePort: 'Source port', sourcePort: 'Source port',
targetIP: 'Destination IP', targetIP: 'Destination IP',
@ -2452,19 +2457,19 @@ const message = {
lock: 'lock', lock: 'lock',
blocked: 'blocked', blocked: 'blocked',
cmdLine: 'Start command', cmdLine: 'Start command',
basic: 'Basic info', basic: 'Basic',
mem: 'Memory info', mem: 'Memory',
openFiles: 'File open', openFiles: 'Open files',
file: 'File', file: 'File',
env: 'Environment', env: 'Environments',
noenv: 'None', noenv: 'None',
net: 'Network connection', net: 'Network connections',
laddr: 'Source address/port', laddr: 'Source address/port',
raddr: 'Destination address/port', raddr: 'Destination address/port',
stopProcess: 'End', stopProcess: 'End',
viewDetails: 'View details', viewDetails: 'View details',
stopProcessWarn: 'Are you sure you want to end this process (PID:{0})? ', stopProcessWarn: 'Are you sure you want to end this process (PID:{0})?',
processName: 'Processname', processName: 'Process name',
}, },
tool: { tool: {
supervisor: { supervisor: {

View File

@ -9,6 +9,7 @@ const message = {
commons: { commons: {
true: '是', true: '是',
false: '否', false: '否',
colon: '',
example: '', example: '',
fit2cloud: '', fit2cloud: '',
button: { button: {
@ -105,7 +106,7 @@ const message = {
tableSetting: '', tableSetting: '',
refreshRate: '', refreshRate: '',
noRefresh: '', noRefresh: '',
refreshRateUnit: '{0} /', refreshRateUnit: ' | {0} / | {0} /',
selectColumn: '', selectColumn: '',
}, },
loadingText: { loadingText: {
@ -434,6 +435,7 @@ const message = {
local: '', local: '',
remote: '', remote: '',
remoteDB: '', remoteDB: '',
manageRemoteDB: '',
createRemoteDB: '', createRemoteDB: '',
unBindRemoteDB: '', unBindRemoteDB: '',
unBindForce: '', unBindForce: '',
@ -950,6 +952,7 @@ const message = {
host: '', host: '',
createConn: '', createConn: '',
group: '', group: '',
manageGroup: '@:terminal.group',
noHost: '', noHost: '',
groupChange: '', groupChange: '',
expand: '', expand: '',
@ -1125,9 +1128,12 @@ const message = {
dir: '', dir: '',
upload: '', upload: '',
download: '', download: '',
uploadFile: '@:file.upload@:file.file',
uploadDirectory: '@:file.upload@:file.dir',
fileName: '', fileName: '',
search: '', search: '',
mode: '', mode: '',
editPermissions: '@:file.mode',
owner: '', owner: '',
file: '', file: '',
remoteFile: '', remoteFile: '',
@ -1366,7 +1372,7 @@ const message = {
developerModeHelper: ' 1Panel ', developerModeHelper: ' 1Panel ',
thirdParty: '', thirdParty: '',
createBackupAccount: ' {0}', addBackupAccount: ' {0}',
noTypeForCreate: '', noTypeForCreate: '',
LOCAL: '', LOCAL: '',
OSS: ' OSS', OSS: ' OSS',
@ -1439,6 +1445,7 @@ const message = {
deleteHelper: '', deleteHelper: '',
status: '', status: '',
ignoreRule: '', ignoreRule: '',
editIgnoreRule: '@:commons.button.edit@:setting.ignoreRule',
ignoreHelper: '使 1Panel ', ignoreHelper: '使 1Panel ',
ignoreHelper1: ' \n*.log\n/opt/1panel/cache', ignoreHelper1: ' \n*.log\n/opt/1panel/cache',
panelInfo: ' 1Panel ', panelInfo: ' 1Panel ',
@ -1791,6 +1798,7 @@ const message = {
ftpHelper: ' FTP FTP ', ftpHelper: ' FTP FTP ',
remark: '', remark: '',
group: '', group: '',
manageGroup: '@:website.group',
groupSetting: '', groupSetting: '',
createGroup: '', createGroup: '',
app: '', app: '',
@ -2192,8 +2200,11 @@ const message = {
addressHelper2: ' IP IP "," 172.16.10.11,172.16.0.0/24', addressHelper2: ' IP IP "," 172.16.10.11,172.16.0.0/24',
allIP: ' IP', allIP: ' IP',
portRule: '', portRule: '',
createPortRule: '@:commons.button.create@:firewall.portRule',
forwardRule: '', forwardRule: '',
createForwardRule: '@:commons.button.create@:firewall.forwardRule',
ipRule: 'IP ', ipRule: 'IP ',
createIpRule: '@:commons.button.create @:firewall.ipRule',
userAgent: 'User-Agent ', userAgent: 'User-Agent ',
sourcePort: '', sourcePort: '',
targetIP: ' IP', targetIP: ' IP',

View File

@ -9,6 +9,7 @@ const message = {
commons: { commons: {
true: '是', true: '是',
false: '否', false: '否',
colon: '',
example: '', example: '',
fit2cloud: '', fit2cloud: '',
button: { button: {
@ -104,8 +105,7 @@ const message = {
protocol: '', protocol: '',
tableSetting: '', tableSetting: '',
refreshRate: '', refreshRate: '',
noRefresh: '', refreshRateUnit: ' | {n} / | {n} /',
refreshRateUnit: '{0} /',
selectColumn: '', selectColumn: '',
}, },
loadingText: { loadingText: {
@ -436,6 +436,7 @@ const message = {
local: '', local: '',
remote: '', remote: '',
remoteDB: '', remoteDB: '',
manageRemoteDB: '',
createRemoteDB: '', createRemoteDB: '',
unBindRemoteDB: '', unBindRemoteDB: '',
unBindForce: '', unBindForce: '',
@ -951,6 +952,7 @@ const message = {
host: '', host: '',
createConn: '', createConn: '',
group: '', group: '',
manageGroup: '@:terminal.group',
noHost: '', noHost: '',
groupChange: '', groupChange: '',
expand: '', expand: '',
@ -1127,9 +1129,12 @@ const message = {
dir: '', dir: '',
upload: '', upload: '',
download: '', download: '',
uploadFile: '@:file.upload@.lower:file.file',
uploadDirectory: '@:file.upload@.lower:file.dir',
fileName: '', fileName: '',
search: '', search: '',
mode: '', mode: '',
editPermissions: '@:file.mode',
owner: '', owner: '',
file: '', file: '',
remoteFile: '', remoteFile: '',
@ -1368,7 +1373,7 @@ const message = {
developerModeHelper: ' 1Panel ', developerModeHelper: ' 1Panel ',
thirdParty: '', thirdParty: '',
createBackupAccount: ' {0}', addBackupAccount: ' {0}',
noTypeForCreate: '', noTypeForCreate: '',
LOCAL: '', LOCAL: '',
OSS: ' OSS', OSS: ' OSS',
@ -1440,6 +1445,7 @@ const message = {
snapshot: '', snapshot: '',
deleteHelper: '', deleteHelper: '',
ignoreRule: '', ignoreRule: '',
editIgnoreRule: '@:commons.button.edit@:setting.ignoreRule',
ignoreHelper: '使 1Panel ', ignoreHelper: '使 1Panel ',
ignoreHelper1: ' \n*.log\n/opt/1panel/cache', ignoreHelper1: ' \n*.log\n/opt/1panel/cache',
status: '', status: '',
@ -1792,6 +1798,7 @@ const message = {
ftpHelper: ' FTP FTP ', ftpHelper: ' FTP FTP ',
remark: '', remark: '',
group: '', group: '',
manageGroup: '@:website.group',
groupSetting: '', groupSetting: '',
createGroup: '', createGroup: '',
app: '', app: '',
@ -2193,8 +2200,11 @@ const message = {
addressHelper2: ' IP IP "," 172.16.10.11,172.16.0.0/24', addressHelper2: ' IP IP "," 172.16.10.11,172.16.0.0/24',
allIP: ' IP', allIP: ' IP',
portRule: '', portRule: '',
createPortRule: '@:commons.button.create@:firewall.portRule',
forwardRule: '', forwardRule: '',
createForwardRule: '@:commons.button.create@:firewall.forwardRule',
ipRule: 'IP ', ipRule: 'IP ',
createIpRule: '@:commons.button.create @:firewall.ipRule',
userAgent: 'User-Agent ', userAgent: 'User-Agent ',
destination: '', destination: '',
sourcePort: '', sourcePort: '',

View File

@ -5,7 +5,7 @@
<el-icon> <el-icon>
<SvgIcon :iconName="(subItem.meta?.icon as string)" /> <SvgIcon :iconName="(subItem.meta?.icon as string)" />
</el-icon> </el-icon>
<span>{{ $t(subItem.meta?.title as string) }}</span> <span>{{ $t(subItem.meta?.title as string, 2) }}</span>
</template> </template>
<SubItem :menuList="subItem.children" /> <SubItem :menuList="subItem.children" />
</el-sub-menu> </el-sub-menu>
@ -15,7 +15,7 @@
<SvgIcon :iconName="(subItem.meta?.icon as string)" /> <SvgIcon :iconName="(subItem.meta?.icon as string)" />
</el-icon> </el-icon>
<template #title> <template #title>
<span>{{ $t(subItem.meta?.title as string) }}</span> <span>{{ $t(subItem.meta?.title as string, 2) }}</span>
</template> </template>
</el-menu-item> </el-menu-item>
@ -24,8 +24,8 @@
<SvgIcon :iconName="(subItem.meta?.icon as string)" /> <SvgIcon :iconName="(subItem.meta?.icon as string)" />
</el-icon> </el-icon>
<template #title> <template #title>
<span v-if="subItem.meta?.icon">{{ $t(subItem.meta?.title as string) }}</span> <span v-if="subItem.meta?.icon">{{ $t(subItem.meta?.title as string, 2) }}</span>
<span v-else style="margin-left: 10px">{{ $t(subItem.meta?.title as string) }}</span> <span v-else style="margin-left: 10px">{{ $t(subItem.meta?.title as string, 2) }}</span>
</template> </template>
</el-menu-item> </el-menu-item>
</template> </template>

View File

@ -448,17 +448,17 @@ export function getAge(d1: string): string {
let res = ''; let res = '';
if (dayDiff > 0) { if (dayDiff > 0) {
res += String(dayDiff) + i18n.global.t('commons.units.day'); res += String(dayDiff) + i18n.global.t('commons.units.day', dayDiff);
if (hours <= 0) { if (hours <= 0) {
return res; return res;
} }
} }
if (hours > 0) { if (hours > 0) {
res += String(hours) + i18n.global.t('commons.units.hour'); res += String(hours) + i18n.global.t('commons.units.hour', hours);
return res; return res;
} }
if (minutes > 0) { if (minutes > 0) {
res += String(minutes) + i18n.global.t('commons.units.minute'); res += String(minutes) + i18n.global.t('commons.units.minute', minutes);
return res; return res;
} }
return i18n.global.t('app.less1Minute'); return i18n.global.t('app.less1Minute');

View File

@ -1,5 +1,5 @@
<template> <template>
<LayoutContent v-loading="loading" v-if="!showDetail" :title="$t('app.app')"> <LayoutContent v-loading="loading" v-if="!showDetail" :title="$t('app.app', 2)">
<template #toolbar> <template #toolbar>
<el-row :gutter="5"> <el-row :gutter="5">
<el-col :xs="24" :sm="20" :md="20" :lg="20" :xl="20"> <el-col :xs="24" :sm="20" :md="20" :lg="20" :xl="20">

View File

@ -212,7 +212,7 @@
</div> </div>
<div class="d-description"> <div class="d-description">
<el-button class="tagMargin" plain size="small"> <el-button class="tagMargin" plain size="small">
{{ $t('app.version') }}{{ installed.version }} {{ $t('app.version') }}{{ $t('commons.colon') }}{{ installed.version }}
</el-button> </el-button>
<el-button <el-button
@ -223,7 +223,7 @@
plain plain
size="small" size="small"
> >
{{ $t('app.busPort') }}{{ installed.httpPort }} {{ $t('app.busPort') }}{{ $t('commons.colon') }}{{ installed.httpPort }}
</el-button> </el-button>
<el-button <el-button
@ -234,12 +234,14 @@
plain plain
size="small" size="small"
> >
{{ $t('app.busPort') }}{{ installed.httpsPort }} {{ $t('app.busPort') }}{{ $t('commons.colon')
}}{{ installed.httpsPort }}
</el-button> </el-button>
<div class="description"> <div class="description">
<span> <span>
{{ $t('app.alreadyRun') }} {{ getAge(installed.createdAt) }} {{ $t('app.alreadyRun') }}{{ $t('commons.colon') }}
{{ getAge(installed.createdAt) }}
</span> </span>
</div> </div>
</div> </div>

View File

@ -9,7 +9,11 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent v-if="!isOnDetail" :title="$t('container.compose')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent
v-if="!isOnDetail"
:title="$t('container.compose', 2)"
:class="{ mask: dockerStatus != 'Running' }"
>
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -5,7 +5,7 @@
<el-button type="primary" class="bt" link @click="goSetting"> {{ $t('container.setting') }} </el-button> <el-button type="primary" class="bt" link @click="goSetting"> {{ $t('container.setting') }} </el-button>
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.container')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.container', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #rightButton> <template #rightButton>
<div class="flex justify-end"> <div class="flex justify-end">
<div class="mr-10"> <div class="mr-10">
@ -649,7 +649,7 @@ const onOperate = async (op: string, row: Container.ContainerInfo | null) => {
const buttons = [ const buttons = [
{ {
label: i18n.global.t('file.terminal'), label: i18n.global.t('container.containerTerminal'),
disabled: (row: Container.ContainerInfo) => { disabled: (row: Container.ContainerInfo) => {
return row.state !== 'running'; return row.state !== 'running';
}, },

View File

@ -6,7 +6,7 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.image')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.image', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -12,35 +12,35 @@ import i18n from '@/lang';
const buttons = [ const buttons = [
{ {
label: i18n.global.t('container.container'), label: i18n.global.t('container.container', 2),
path: '/containers/container', path: '/containers/container',
}, },
{ {
label: i18n.global.t('container.compose'), label: i18n.global.t('container.compose', 2),
path: '/containers/compose', path: '/containers/compose',
}, },
{ {
label: i18n.global.t('container.image'), label: i18n.global.t('container.image', 2),
path: '/containers/image', path: '/containers/image',
}, },
{ {
label: i18n.global.t('container.network'), label: i18n.global.t('container.network', 2),
path: '/containers/network', path: '/containers/network',
}, },
{ {
label: i18n.global.t('container.volume'), label: i18n.global.t('container.volume', 2),
path: '/containers/volume', path: '/containers/volume',
}, },
{ {
label: i18n.global.t('container.repo'), label: i18n.global.t('container.repo', 2),
path: '/containers/repo', path: '/containers/repo',
}, },
{ {
label: i18n.global.t('container.composeTemplate'), label: i18n.global.t('container.composeTemplate', 2),
path: '/containers/template', path: '/containers/template',
}, },
{ {
label: i18n.global.t('container.setting'), label: i18n.global.t('container.setting', 2),
path: '/containers/setting', path: '/containers/setting',
}, },
]; ];

View File

@ -6,7 +6,7 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.network')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.network', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -6,7 +6,7 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.repo')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.repo', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -8,7 +8,7 @@
> >
<template #header> <template #header>
<DrawerHeader <DrawerHeader
:header="title + $t('container.repo')" :header="title + $t('container.repo').toLowerCase()"
:resource="dialogData.rowData?.name" :resource="dialogData.rowData?.name"
:back="handleClose" :back="handleClose"
/> />

View File

@ -29,7 +29,7 @@
</el-card> </el-card>
</div> </div>
<LayoutContent style="margin-top: 20px" :title="$t('container.setting')" :divider="true"> <LayoutContent style="margin-top: 20px" :title="$t('container.setting', 2)" :divider="true">
<template #main> <template #main>
<el-radio-group v-model="confShowType" @change="changeMode"> <el-radio-group v-model="confShowType" @change="changeMode">
<el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button> <el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button>

View File

@ -6,7 +6,7 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.composeTemplate')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.composeTemplate', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -8,7 +8,7 @@
> >
<template #header> <template #header>
<DrawerHeader <DrawerHeader
:header="title + $t('container.composeTemplate')" :header="title + $t('container.composeTemplate').toLowerCase()"
:hideResource="dialogData.title === 'create'" :hideResource="dialogData.title === 'create'"
:resource="dialogData.rowData?.name" :resource="dialogData.rowData?.name"
:back="handleClose" :back="handleClose"

View File

@ -6,7 +6,7 @@
<span>{{ $t('container.startIn') }}</span> <span>{{ $t('container.startIn') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('container.volume')" :class="{ mask: dockerStatus != 'Running' }"> <LayoutContent :title="$t('container.volume', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">

View File

@ -3,17 +3,17 @@
<RouterButton <RouterButton
:buttons="[ :buttons="[
{ {
label: i18n.global.t('cronjob.cronTask'), label: i18n.global.t('cronjob.cronTask', 2),
path: '/cronjobs', path: '/cronjobs',
}, },
]" ]"
/> />
<LayoutContent v-loading="loading" v-if="!isRecordShow" :title="$t('cronjob.cronTask')"> <LayoutContent v-loading="loading" v-if="!isRecordShow" :title="$t('cronjob.cronTask', 2)">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
<el-button type="primary" @click="onOpenDialog('create')"> <el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.create') }}{{ $t('cronjob.cronTask') }} {{ $t('cronjob.create') }}
</el-button> </el-button>
<el-button-group class="ml-4"> <el-button-group class="ml-4">
<el-button plain :disabled="selects.length === 0" @click="onBatchChangeStatus('enable')"> <el-button plain :disabled="selects.length === 0" @click="onBatchChangeStatus('enable')">

View File

@ -85,7 +85,7 @@
{{ $t('database.loadFromRemote') }} {{ $t('database.loadFromRemote') }}
</el-button> </el-button>
<el-button @click="goRemoteDB" type="primary" plain> <el-button @click="goRemoteDB" type="primary" plain>
{{ $t('database.remoteDB') }} {{ $t('database.manageRemoteDB') }}
</el-button> </el-button>
<div> <div>
<el-dropdown> <el-dropdown>

View File

@ -77,7 +77,7 @@
{{ $t('database.loadFromRemote') }} {{ $t('database.loadFromRemote') }}
</el-button> </el-button>
<el-button @click="goRemoteDB" type="primary" plain> <el-button @click="goRemoteDB" type="primary" plain>
{{ $t('database.remoteDB') }} {{ $t('database.manageRemoteDB') }}
</el-button> </el-button>
<el-button @click="goDashboard()" type="primary" plain>PGAdmin4</el-button> <el-button @click="goDashboard()" type="primary" plain>PGAdmin4</el-button>
</div> </div>

View File

@ -60,7 +60,7 @@
{{ $t('database.databaseConnInfo') }} {{ $t('database.databaseConnInfo') }}
</el-button> </el-button>
<el-button @click="goRemoteDB" type="primary" plain> <el-button @click="goRemoteDB" type="primary" plain>
{{ $t('database.remoteDB') }} {{ $t('database.manageRemoteDB') }}
</el-button> </el-button>
</div> </div>
</div> </div>

View File

@ -45,19 +45,19 @@
<div class="h-overview"> <div class="h-overview">
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<span>{{ $t('menu.website') }}</span> <span>{{ $t('menu.website', 2) }}</span>
<div class="count"> <div class="count">
<span @click="goRouter('/websites')">{{ baseInfo?.websiteNumber }}</span> <span @click="goRouter('/websites')">{{ baseInfo?.websiteNumber }}</span>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<span>{{ $t('menu.database') }} - {{ $t('database.all') }}</span> <span>{{ $t('menu.database', 2) }} - {{ $t('database.all') }}</span>
<div class="count"> <div class="count">
<span @click="goRouter('/databases')">{{ baseInfo?.databaseNumber }}</span> <span @click="goRouter('/databases')">{{ baseInfo?.databaseNumber }}</span>
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<span>{{ $t('menu.cronjob') }}</span> <span>{{ $t('menu.cronjob', 2) }}</span>
<div class="count"> <div class="count">
<span @click="goRouter('/cronjobs')"> <span @click="goRouter('/cronjobs')">
{{ baseInfo?.cronjobNumber }} {{ baseInfo?.cronjobNumber }}
@ -566,16 +566,16 @@ function loadUpTime(uptime: number) {
if (days !== 0) { if (days !== 0) {
return ( return (
days + days +
i18n.global.t('commons.units.day') + i18n.global.t('commons.units.day', days) +
' ' + ' ' +
hours + hours +
i18n.global.t('commons.units.hour') + i18n.global.t('commons.units.hour', hours) +
' ' + ' ' +
minutes + minutes +
i18n.global.t('commons.units.minute') + i18n.global.t('commons.units.minute', minutes) +
' ' + ' ' +
seconds + seconds +
i18n.global.t('commons.units.second') i18n.global.t('commons.units.second', seconds)
); );
} }
if (hours !== 0) { if (hours !== 0) {

View File

@ -90,14 +90,10 @@
</el-col> </el-col>
<el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center"> <el-col :xs="12" :sm="12" :md="6" :lg="6" :xl="6" align="center">
<el-popover placement="bottom" :width="200" trigger="hover" v-if="chartsOption['load']"> <el-popover placement="bottom" :width="200" trigger="hover" v-if="chartsOption['load']">
<el-tag class="tagClass">{{ $t('home.loadAverage', 1) }}: {{ formatNumber(currentInfo.load1) }}</el-tag>
<el-tag class="tagClass">{{ $t('home.loadAverage', 5) }}: {{ formatNumber(currentInfo.load5) }}</el-tag>
<el-tag class="tagClass"> <el-tag class="tagClass">
{{ $t('home.loadAverage', [1]) }}: {{ formatNumber(currentInfo.load1) }} {{ $t('home.loadAverage', 15) }}: {{ formatNumber(currentInfo.load15) }}
</el-tag>
<el-tag class="tagClass">
{{ $t('home.loadAverage', [5]) }}: {{ formatNumber(currentInfo.load5) }}
</el-tag>
<el-tag class="tagClass">
{{ $t('home.loadAverage', [15]) }}: {{ formatNumber(currentInfo.load15) }}
</el-tag> </el-tag>
<template #reference> <template #reference>
<v-charts <v-charts

View File

@ -7,7 +7,7 @@
size="50%" size="50%"
> >
<template #header> <template #header>
<DrawerHeader :header="$t('file.setRole')" :back="handleClose" /> <DrawerHeader :header="$t('file.editPermissions')" :back="handleClose" />
</template> </template>
<el-row> <el-row>

View File

@ -7,7 +7,7 @@
size="50%" size="50%"
> >
<template #header> <template #header>
<DrawerHeader :header="$t('file.setRole')" :resource="name" :back="handleClose" /> <DrawerHeader :header="$t('file.editPermissions')" :resource="name" :back="handleClose" />
</template> </template>
<el-row> <el-row>

View File

@ -42,7 +42,11 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-checkbox v-if="addForm.isDir" v-model="setRole" :label="$t('file.setRole')"></el-checkbox> <el-checkbox
v-if="addForm.isDir"
v-model="setRole"
:label="$t('file.editPermissions')"
></el-checkbox>
</el-form-item> </el-form-item>
</el-form> </el-form>
<FileRole v-if="setRole" :mode="'0755'" @get-mode="getMode" :key="open.toString()"></FileRole> <FileRole v-if="setRole" :mode="'0755'" @get-mode="getMode" :key="open.toString()"></FileRole>

View File

@ -94,7 +94,7 @@
{{ $t('file.compress') }} {{ $t('file.compress') }}
</el-button> </el-button>
<el-button plain @click="openBatchRole(selects)" :disabled="selects.length === 0"> <el-button plain @click="openBatchRole(selects)" :disabled="selects.length === 0">
{{ $t('file.role') }} {{ $t('file.editPermissions') }}
</el-button> </el-button>
<el-button plain @click="batchDelFiles" :disabled="selects.length === 0"> <el-button plain @click="batchDelFiles" :disabled="selects.length === 0">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}
@ -102,7 +102,7 @@
</el-button-group> </el-button-group>
<el-button class="btn" @click="toTerminal"> <el-button class="btn" @click="toTerminal">
{{ $t('menu.terminal') }} {{ $t('file.terminal') }}
</el-button> </el-button>
<el-button-group class="copy-button" v-if="moveOpen"> <el-button-group class="copy-button" v-if="moveOpen">
@ -1088,7 +1088,7 @@ const buttons = [
}, },
}, },
{ {
label: i18n.global.t('file.mode'), label: i18n.global.t('file.editPermissions'),
click: (row: File.File) => { click: (row: File.File) => {
openBatchRole([row]); openBatchRole([row]);
}, },

View File

@ -13,9 +13,9 @@
<div class="button-container"> <div class="button-container">
<div> <div>
<el-button type="primary" @click="upload('file')"> <el-button type="primary" @click="upload('file')">
{{ $t('file.upload') }}{{ $t('file.file') }} {{ $t('file.uploadFile') }}
</el-button> </el-button>
<el-button type="primary" @click="upload('dir')">{{ $t('file.upload') }}{{ $t('file.dir') }}</el-button> <el-button type="primary" @click="upload('dir')">{{ $t('file.uploadDirectory') }}</el-button>
</div> </div>
<el-button @click="clearFiles">{{ $t('file.clearList') }}</el-button> <el-button @click="clearFiles">{{ $t('file.clearList') }}</el-button>
</div> </div>

View File

@ -17,12 +17,12 @@
<span>{{ $t('firewall.firewallNotStart') }}</span> <span>{{ $t('firewall.firewallNotStart') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('firewall.forwardRule')" :class="{ mask: fireStatus != 'running' }"> <LayoutContent :title="$t('firewall.forwardRule', 2)" :class="{ mask: fireStatus != 'running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
<el-button type="primary" @click="onOpenDialog('create')"> <el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.create') }}{{ $t('firewall.forwardRule') }} {{ $t('firewall.createForwardRule') }}
</el-button> </el-button>
<el-button @click="onDelete(null)" plain :disabled="selects.length === 0"> <el-button @click="onDelete(null)" plain :disabled="selects.length === 0">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -12,15 +12,15 @@ import i18n from '@/lang';
const buttons = [ const buttons = [
{ {
label: i18n.global.t('firewall.portRule'), label: i18n.global.t('firewall.portRule', 2),
path: '/hosts/firewall/port', path: '/hosts/firewall/port',
}, },
{ {
label: i18n.global.t('firewall.forwardRule'), label: i18n.global.t('firewall.forwardRule', 2),
path: '/hosts/firewall/forward', path: '/hosts/firewall/forward',
}, },
{ {
label: i18n.global.t('firewall.ipRule'), label: i18n.global.t('firewall.ipRule', 2),
path: '/hosts/firewall/ip', path: '/hosts/firewall/ip',
}, },
]; ];

View File

@ -18,12 +18,12 @@
<span>{{ $t('firewall.firewallNotStart') }}</span> <span>{{ $t('firewall.firewallNotStart') }}</span>
</el-card> </el-card>
<LayoutContent :title="$t('firewall.ipRule')" :class="{ mask: fireStatus != 'running' }"> <LayoutContent :title="$t('firewall.ipRule', 2)" :class="{ mask: fireStatus != 'running' }">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
<el-button type="primary" @click="onOpenDialog('create')"> <el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.create') }} {{ $t('firewall.ipRule') }} {{ $t('firewall.createIpRule') }}
</el-button> </el-button>
<el-button @click="onDelete(null)" plain :disabled="selects.length === 0"> <el-button @click="onDelete(null)" plain :disabled="selects.length === 0">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -55,7 +55,7 @@
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
<el-button type="primary" @click="onOpenDialog('create')"> <el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.create') }}{{ $t('firewall.portRule') }} {{ $t('firewall.createPortRule') }}
</el-button> </el-button>
<el-button @click="onDelete(null)" plain :disabled="selects.length === 0"> <el-button @click="onDelete(null)" plain :disabled="selects.length === 0">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -16,7 +16,7 @@ const buttons = [
path: '/hosts/monitor/monitor', path: '/hosts/monitor/monitor',
}, },
{ {
label: i18n.global.t('commons.button.set'), label: i18n.global.t('menu.settings', 2),
path: '/hosts/monitor/setting', path: '/hosts/monitor/setting',
}, },
]; ];

View File

@ -118,7 +118,7 @@
<el-card style="overflow: inherit"> <el-card style="overflow: inherit">
<template #header> <template #header>
<div :class="mobile ? 'flx-wrap' : 'flx-justify-between'"> <div :class="mobile ? 'flx-wrap' : 'flx-justify-between'">
<span class="title">{{ $t('monitor.disk') }} IO</span> <span class="title">{{ $t('monitor.disk') }} I/O</span>
<el-date-picker <el-date-picker
@change="search('io')" @change="search('io')"
v-model="timeRangeIO" v-model="timeRangeIO"
@ -149,7 +149,7 @@
<template #header> <template #header>
<div :class="mobile ? 'flx-wrap' : 'flx-justify-between'"> <div :class="mobile ? 'flx-wrap' : 'flx-justify-between'">
<div> <div>
<span class="title">{{ $t('monitor.network') }} IO:</span> <span class="title">{{ $t('monitor.network') }}{{ $t('commons.colon') }}</span>
<el-popover placement="bottom" :width="200" trigger="click"> <el-popover placement="bottom" :width="200" trigger="click">
<el-select @change="search('network')" v-model="networkChoose"> <el-select @change="search('network')" v-model="networkChoose">
<template #prefix>{{ $t('monitor.networkCard') }}</template> <template #prefix>{{ $t('monitor.networkCard') }}</template>
@ -398,15 +398,15 @@ function initLoadCharts(item: Host.MonitorData) {
xData: loadDate, xData: loadDate,
yData: [ yData: [
{ {
name: '1 ' + i18n.global.t('commons.units.minute'), name: '1 ' + i18n.global.t('commons.units.minute', 1),
data: load1Data, data: load1Data,
}, },
{ {
name: '5 ' + i18n.global.t('commons.units.minute'), name: '5 ' + i18n.global.t('commons.units.minute', 5),
data: load5Data, data: load5Data,
}, },
{ {
name: '15 ' + i18n.global.t('commons.units.minute'), name: '15 ' + i18n.global.t('commons.units.minute', 15),
data: load15Data, data: load15Data,
}, },
{ {
@ -416,7 +416,7 @@ function initLoadCharts(item: Host.MonitorData) {
}, },
], ],
yAxis: [ yAxis: [
{ type: 'value', name: i18n.global.t('monitor.loadDetail') + ' ( % )' }, { type: 'value', name: i18n.global.t('monitor.loadDetail') },
{ {
type: 'value', type: 'value',
name: i18n.global.t('monitor.resourceUsage') + ' ( % )', name: i18n.global.t('monitor.resourceUsage') + ' ( % )',
@ -425,7 +425,22 @@ function initLoadCharts(item: Host.MonitorData) {
}, },
], ],
grid: mobile.value ? { left: '15%', right: '15%', bottom: '20%' } : null, grid: mobile.value ? { left: '15%', right: '15%', bottom: '20%' } : null,
formatStr: '%', tooltip: {
trigger: 'axis',
formatter: function (datas: any) {
let res = datas[0].name + '<br/>';
for (const item of datas) {
if (item.seriesName === i18n.global.t('monitor.resourceUsage')) {
res +=
item.marker + ' ' + item.seriesName + i18n.global.t('commons.colon') + item.data + '%<br/>';
} else {
res +=
item.marker + ' ' + item.seriesName + i18n.global.t('commons.colon') + item.data + '<br/>';
}
}
return res;
},
},
}; };
} }
@ -481,14 +496,20 @@ function initIOCharts(item: Host.MonitorData) {
item.seriesName === i18n.global.t('monitor.read') || item.seriesName === i18n.global.t('monitor.read') ||
item.seriesName === i18n.global.t('monitor.write') item.seriesName === i18n.global.t('monitor.write')
) { ) {
res += item.marker + ' ' + item.seriesName + '' + computeSizeFromKBs(item.data) + '<br/>'; res +=
item.marker +
' ' +
item.seriesName +
i18n.global.t('commons.colon') +
computeSizeFromKBs(item.data) +
'<br/>';
} }
if (item.seriesName === i18n.global.t('monitor.readWriteCount')) { if (item.seriesName === i18n.global.t('monitor.readWriteCount')) {
res += res +=
item.marker + item.marker +
' ' + ' ' +
item.seriesName + item.seriesName +
'' + i18n.global.t('commons.colon') +
item.data + item.data +
' ' + ' ' +
i18n.global.t('commons.units.time') + i18n.global.t('commons.units.time') +
@ -496,7 +517,14 @@ function initIOCharts(item: Host.MonitorData) {
'<br/>'; '<br/>';
} }
if (item.seriesName === i18n.global.t('monitor.readWriteTime')) { if (item.seriesName === i18n.global.t('monitor.readWriteTime')) {
res += item.marker + ' ' + item.seriesName + '' + item.data + ' ms' + '<br/>'; res +=
item.marker +
' ' +
item.seriesName +
i18n.global.t('commons.colon') +
item.data +
' ms' +
'<br/>';
} }
} }
return res; return res;

View File

@ -2,7 +2,7 @@
<div> <div>
<MonitorRouter /> <MonitorRouter />
<LayoutContent v-loading="loading" :title="$t('commons.button.set')" :divider="true"> <LayoutContent v-loading="loading" :title="$t('menu.settings', 2)" :divider="true">
<template #main> <template #main>
<el-form :model="form" @submit.prevent ref="panelFormRef" label-position="left" label-width="160px"> <el-form :model="form" @submit.prevent ref="panelFormRef" label-position="left" label-width="160px">
<el-row> <el-row>

View File

@ -12,11 +12,11 @@ import i18n from '@/lang';
const buttons = [ const buttons = [
{ {
label: i18n.global.t('menu.process'), label: i18n.global.t('menu.process', 2),
path: '/hosts/process/process', path: '/hosts/process/process',
}, },
{ {
label: i18n.global.t('menu.network'), label: i18n.global.t('menu.network', 2),
path: '/hosts/process/network', path: '/hosts/process/network',
}, },
]; ];

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<FireRouter /> <FireRouter />
<LayoutContent :title="$t('menu.network')" v-loading="loading"> <LayoutContent :title="$t('menu.network', 2)" v-loading="loading">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div><!-- 占位 --></div> <div><!-- 占位 --></div>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<FireRouter /> <FireRouter />
<LayoutContent :title="$t('menu.process')" v-loading="loading"> <LayoutContent :title="$t('menu.process', 2)" v-loading="loading">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div><!-- 占位 --></div> <div><!-- 占位 --></div>

View File

@ -12,15 +12,15 @@ import i18n from '@/lang';
const buttons = [ const buttons = [
{ {
label: i18n.global.t('menu.config'), label: i18n.global.t('menu.settings', 2),
path: '/hosts/ssh/ssh', path: '/hosts/ssh/ssh',
}, },
{ {
label: i18n.global.t('ssh.session'), label: i18n.global.t('ssh.session', 2),
path: '/hosts/ssh/session', path: '/hosts/ssh/session',
}, },
{ {
label: i18n.global.t('ssh.loginLogs'), label: i18n.global.t('ssh.loginLogs', 2),
path: '/hosts/ssh/log', path: '/hosts/ssh/log',
}, },
]; ];

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<LayoutContent v-loading="loading" :title="$t('ssh.loginLogs')"> <LayoutContent v-loading="loading" :title="$t('ssh.loginLogs', 2)">
<template #prompt> <template #prompt>
<el-alert type="info" :title="$t('ssh.sshAlert2')" :closable="false" /> <el-alert type="info" :title="$t('ssh.sshAlert2')" :closable="false" />
<div class="mt-2"><el-alert type="info" :title="$t('ssh.sshAlert')" :closable="false" /></div> <div class="mt-2"><el-alert type="info" :title="$t('ssh.sshAlert')" :closable="false" /></div>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<FireRouter /> <FireRouter />
<LayoutContent :title="$t('ssh.session')"> <LayoutContent :title="$t('ssh.session', 2)">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div><!-- 占位 --></div> <div><!-- 占位 --></div>

View File

@ -52,7 +52,7 @@
</el-card> </el-card>
</div> </div>
<LayoutContent style="margin-top: 20px" :title="$t('menu.config')" :divider="true"> <LayoutContent style="margin-top: 20px" :title="$t('menu.settings', 2)" :divider="true">
<template #main> <template #main>
<el-radio-group v-model="confShowType" @change="changeMode"> <el-radio-group v-model="confShowType" @change="changeMode">
<el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button> <el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button>

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<LayoutContent v-loading="loading" :title="$t('terminal.quickCommand')"> <LayoutContent v-loading="loading" :title="$t('terminal.quickCommand', 2)">
<template #prompt> <template #prompt>
<el-alert type="info" :title="$t('terminal.quickCommandHelper')" :closable="false" /> <el-alert type="info" :title="$t('terminal.quickCommandHelper')" :closable="false" />
</template> </template>
@ -8,10 +8,10 @@
<div class="flex w-full flex-col gap-4 md:justify-between md:flex-row"> <div class="flex w-full flex-col gap-4 md:justify-between md:flex-row">
<div class="flex flex-wrap gap-4"> <div class="flex flex-wrap gap-4">
<el-button type="primary" @click="onCreate()"> <el-button type="primary" @click="onCreate()">
{{ $t('commons.button.create') }}{{ $t('terminal.quickCommand') }} {{ $t('commons.button.create') }}
</el-button> </el-button>
<el-button type="primary" plain @click="onOpenGroupDialog()"> <el-button type="primary" plain @click="onOpenGroupDialog()">
{{ $t('terminal.group') }} {{ $t('terminal.manageGroup') }}
</el-button> </el-button>
<el-button type="primary" plain :disabled="selects.length === 0" @click="batchDelete(null)"> <el-button type="primary" plain :disabled="selects.length === 0" @click="batchDelete(null)">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<LayoutContent v-loading="loading" :title="$t('terminal.host')"> <LayoutContent v-loading="loading" :title="$t('terminal.host', 2)">
<template #toolbar> <template #toolbar>
<div class="flex w-full flex-col gap-4 md:justify-between md:flex-row"> <div class="flex w-full flex-col gap-4 md:justify-between md:flex-row">
<div class="flex flex-wrap gap-4"> <div class="flex flex-wrap gap-4">
@ -8,7 +8,7 @@
{{ $t('terminal.addHost') }} {{ $t('terminal.addHost') }}
</el-button> </el-button>
<el-button type="primary" plain @click="onOpenGroupDialog()"> <el-button type="primary" plain @click="onOpenGroupDialog()">
{{ $t('terminal.group') }} {{ $t('terminal.manageGroup') }}
</el-button> </el-button>
<el-button type="primary" plain :disabled="selects.length === 0" @click="onBatchDelete(null)"> <el-button type="primary" plain :disabled="selects.length === 0" @click="onBatchDelete(null)">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -3,13 +3,13 @@
<el-card class="router_card"> <el-card class="router_card">
<el-radio-group v-model="activeNames" @change="handleChange"> <el-radio-group v-model="activeNames" @change="handleChange">
<el-radio-button class="router_card_button" size="large" value="terminal"> <el-radio-button class="router_card_button" size="large" value="terminal">
{{ $t('menu.terminal') }} {{ $t('menu.terminal', 2) }}
</el-radio-button> </el-radio-button>
<el-radio-button class="router_card_button" size="large" value="host"> <el-radio-button class="router_card_button" size="large" value="host">
{{ $t('menu.host') }} {{ $t('menu.host', 2) }}
</el-radio-button> </el-radio-button>
<el-radio-button class="router_card_button" size="large" value="command"> <el-radio-button class="router_card_button" size="large" value="command">
{{ $t('terminal.quickCommand') }} {{ $t('terminal.quickCommand', 2) }}
</el-radio-button> </el-radio-button>
</el-radio-group> </el-radio-group>
</el-card> </el-card>

View File

@ -102,7 +102,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'S3')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'S3')">
{{ $t('setting.createBackupAccount', [$t('setting.S3')]) }} {{ $t('setting.addBackupAccount', [$t('setting.S3')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -158,7 +158,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'OSS')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'OSS')">
{{ $t('setting.createBackupAccount', [$t('setting.OSS')]) }} {{ $t('setting.addBackupAccount', [$t('setting.OSS')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -215,7 +215,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'COS')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'COS')">
{{ $t('setting.createBackupAccount', [$t('setting.COS')]) }} {{ $t('setting.addBackupAccount', [$t('setting.COS')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -277,7 +277,7 @@
type="primary" type="primary"
@click="onOpenDialog('create', 'OneDrive')" @click="onOpenDialog('create', 'OneDrive')"
> >
{{ $t('setting.createBackupAccount', [$t('setting.OneDrive')]) }} {{ $t('setting.addBackupAccount', [$t('setting.OneDrive')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -321,7 +321,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'KODO')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'KODO')">
{{ $t('setting.createBackupAccount', [$t('setting.KODO')]) }} {{ $t('setting.addBackupAccount', [$t('setting.KODO')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -362,7 +362,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'MINIO')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'MINIO')">
{{ $t('setting.createBackupAccount', [$t('setting.MINIO')]) }} {{ $t('setting.addBackupAccount', [$t('setting.MINIO')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -405,7 +405,7 @@
</div> </div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false"> <el-alert v-else center class="alert" style="height: 257px" :closable="false">
<el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'SFTP')"> <el-button size="large" round plain type="primary" @click="onOpenDialog('create', 'SFTP')">
{{ $t('setting.createBackupAccount', [$t('setting.SFTP')]) }} {{ $t('setting.addBackupAccount', [$t('setting.SFTP')]) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>
@ -449,7 +449,7 @@
type="primary" type="primary"
@click="onOpenDialog('create', 'WebDAV')" @click="onOpenDialog('create', 'WebDAV')"
> >
{{ $t('setting.createBackupAccount', ['WebDAV']) }} {{ $t('setting.addBackupAccount', ['WebDAV']) }}
</el-button> </el-button>
</el-alert> </el-alert>
</el-col> </el-col>

View File

@ -8,7 +8,7 @@
size="50%" size="50%"
> >
<template #header> <template #header>
<DrawerHeader :header="title + $t('setting.backupAccount')" :back="handleClose" /> <DrawerHeader :header="title + $t('setting.backupAccount').toLowerCase()" :back="handleClose" />
</template> </template>
<el-form @submit.prevent ref="formRef" v-loading="loading" label-position="top" :model="s3Data.rowData"> <el-form @submit.prevent ref="formRef" v-loading="loading" label-position="top" :model="s3Data.rowData">
<el-row type="flex" justify="center"> <el-row type="flex" justify="center">

View File

@ -22,11 +22,11 @@ const buttons = [
path: '/settings/safe', path: '/settings/safe',
}, },
{ {
label: i18n.global.t('setting.backupAccount'), label: i18n.global.t('setting.backupAccount', 2),
path: '/settings/backupaccount', path: '/settings/backupaccount',
}, },
{ {
label: i18n.global.t('setting.snapshot'), label: i18n.global.t('setting.snapshot', 2),
path: '/settings/snapshot', path: '/settings/snapshot',
}, },
{ {

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<LayoutContent v-loading="loading" v-if="!isRecordShow" :title="$t('setting.snapshot')"> <LayoutContent v-loading="loading" v-if="!isRecordShow" :title="$t('setting.snapshot', 2)">
<template #toolbar> <template #toolbar>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row"> <div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
@ -11,7 +11,7 @@
{{ $t('setting.importSnapshot') }} {{ $t('setting.importSnapshot') }}
</el-button> </el-button>
<el-button type="primary" plain @click="onIgnore()"> <el-button type="primary" plain @click="onIgnore()">
{{ $t('setting.ignoreRule') }} {{ $t('setting.editIgnoreRule') }}
</el-button> </el-button>
<el-button type="primary" plain :disabled="selects.length === 0" @click="batchDelete(null)"> <el-button type="primary" plain :disabled="selects.length === 0" @click="batchDelete(null)">
{{ $t('commons.button.delete') }} {{ $t('commons.button.delete') }}

View File

@ -7,7 +7,7 @@
@close="handleClose" @close="handleClose"
> >
<template #header> <template #header>
<DrawerHeader :header="$t('ssl.ca')" :back="handleClose" /> <DrawerHeader :header="$t('ssl.selfSigned')" :back="handleClose" />
</template> </template>
<ComplexTable :data="data" :pagination-config="paginationConfig" @search="search()" v-loading="loading"> <ComplexTable :data="data" :pagination-config="paginationConfig" @search="search()" v-loading="loading">
<template #toolbar> <template #toolbar>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<RouterButton :buttons="routerButton" /> <RouterButton :buttons="routerButton" />
<LayoutContent :title="$t('website.ssl')"> <LayoutContent :title="$t('website.ssl', 2)">
<template #toolbar> <template #toolbar>
<div class="flex flex-wrap gap-3"> <div class="flex flex-wrap gap-3">
<el-button type="primary" @click="openSSL()"> <el-button type="primary" @click="openSSL()">
@ -192,7 +192,7 @@ let selects = ref<any>([]);
const routerButton = [ const routerButton = [
{ {
label: i18n.global.t('website.ssl'), label: i18n.global.t('website.ssl', 2),
path: '/websites/ssl', path: '/websites/ssl',
}, },
]; ];

View File

@ -25,7 +25,7 @@
{{ $t('website.log') }} {{ $t('website.log') }}
</el-button> </el-button>
<el-button type="primary" :plain="index !== 'resource'" @click="changeTab('resource')"> <el-button type="primary" :plain="index !== 'resource'" @click="changeTab('resource')">
{{ $t('website.source') }} {{ $t('website.source', 2) }}
</el-button> </el-button>
<el-button type="primary" v-if="configPHP" :plain="index !== 'php'" @click="changeTab('php')"> <el-button type="primary" v-if="configPHP" :plain="index !== 'php'" @click="changeTab('php')">
PHP PHP

View File

@ -3,12 +3,12 @@
<RouterButton <RouterButton
:buttons="[ :buttons="[
{ {
label: i18n.global.t('website.website'), label: i18n.global.t('website.website', 2),
path: '/websites', path: '/websites',
}, },
]" ]"
/> />
<LayoutContent :title="$t('website.website')" v-loading="loading"> <LayoutContent :title="$t('website.website', 2)" v-loading="loading">
<template #app> <template #app>
<AppStatus <AppStatus
:app-key="'openresty'" :app-key="'openresty'"
@ -28,7 +28,7 @@
{{ $t('website.create') }} {{ $t('website.create') }}
</el-button> </el-button>
<el-button type="primary" plain @click="openGroup"> <el-button type="primary" plain @click="openGroup">
{{ $t('website.group') }} {{ $t('website.manageGroup') }}
</el-button> </el-button>
<el-button type="primary" plain @click="openDefault"> <el-button type="primary" plain @click="openDefault">
{{ $t('website.defaultServer') }} {{ $t('website.defaultServer') }}