1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-01-19 00:09:16 +08:00

Refine pluralization of some English words (#7318)

* Refine plural translation of English words

* Remove useless i18n modifier
This commit is contained in:
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-codemirror": "^6.1.1",
"vue-demi": "^0.14.6",
"vue-i18n": "^9.13.1",
"vue-i18n": "^10.0.5",
"vue-router": "^4.3.3"
},
"devDependencies": {

View File

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

View File

@ -7,13 +7,13 @@
<div style="margin-left: 15px">
<span>{{ $t('commons.table.refreshRate') }}</span>
<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', [5])" :value="5"></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', [60])" :value="60"></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', 0)" :value="0"></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', 30)" :value="30"></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', 300)" :value="300"></el-option>
</el-select>
</div>
</el-popover>

View File

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

View File

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

View File

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

View File

@ -9,6 +9,7 @@ const message = {
commons: {
true: '是',
false: '否',
colon: '',
example: '例如',
fit2cloud: '飞致云',
button: {
@ -105,7 +106,7 @@ const message = {
tableSetting: '列表設置',
refreshRate: '刷新頻率',
noRefresh: '不刷新',
refreshRateUnit: '{0} /',
refreshRateUnit: '不刷新 | {0} / | {0} /',
selectColumn: '選擇列',
},
loadingText: {
@ -434,6 +435,7 @@ const message = {
local: '本地',
remote: '遠程',
remoteDB: '遠程服務器',
manageRemoteDB: '管理遠程服務器',
createRemoteDB: '添加遠程服務器',
unBindRemoteDB: '解綁遠程服務器',
unBindForce: '強制解綁',
@ -950,6 +952,7 @@ const message = {
host: '主機',
createConn: '新建連接',
group: '分組',
manageGroup: '管理@:terminal.group',
noHost: '暫無主機',
groupChange: '切換分組',
expand: '全部展開',
@ -1125,9 +1128,12 @@ const message = {
dir: '文件夾',
upload: '上傳',
download: '下載',
uploadFile: '@:file.upload@:file.file',
uploadDirectory: '@:file.upload@:file.dir',
fileName: '文件名',
search: '在當前目錄下查找',
mode: '權限',
editPermissions: '編輯@:file.mode',
owner: '所有者',
file: '文件',
remoteFile: '遠程下載',
@ -1366,7 +1372,7 @@ const message = {
developerModeHelper: '獲取 1Panel 的預覽版本以分享有關新功能和更新的反饋',
thirdParty: '第三方賬號',
createBackupAccount: '添加 {0}',
addBackupAccount: '添加 {0}',
noTypeForCreate: '當前無可創建備份類型',
LOCAL: '服務器磁盤',
OSS: '阿裏雲 OSS',
@ -1439,6 +1445,7 @@ const message = {
deleteHelper: '將刪除該快照的所有備份文件包括第三方備份賬號中的文件',
status: '快照狀態',
ignoreRule: '排除規則',
editIgnoreRule: '@:commons.button.edit@:setting.ignoreRule',
ignoreHelper: '快照時將使用該規則對 1Panel 數據目錄進行壓縮備份預設忽略套接字檔案',
ignoreHelper1: '一行一個 \n*.log\n/opt/1panel/cache',
panelInfo: '寫入 1Panel 基礎信息',
@ -1791,6 +1798,7 @@ const message = {
ftpHelper: '建立站點的同時為站點建立一個對應 FTP 帳戶並且 FTP 目錄指向站點所在目錄',
remark: '備註',
group: '分組',
manageGroup: '@:website.group',
groupSetting: '分組管理',
createGroup: '創建分組',
app: '應用',
@ -2192,8 +2200,11 @@ const message = {
addressHelper2: '多個 IP IP 請用 "," 隔開172.16.10.11,172.16.0.0/24',
allIP: '所有 IP',
portRule: '端口規則',
createPortRule: '@:commons.button.create@:firewall.portRule',
forwardRule: '端口轉發',
createForwardRule: '@:commons.button.create@:firewall.forwardRule',
ipRule: 'IP 規則',
createIpRule: '@:commons.button.create @:firewall.ipRule',
userAgent: 'User-Agent 過濾',
sourcePort: '來源端口',
targetIP: '目標 IP',

View File

@ -9,6 +9,7 @@ const message = {
commons: {
true: '是',
false: '否',
colon: '',
example: '',
fit2cloud: '飞致云',
button: {
@ -104,8 +105,7 @@ const message = {
protocol: '协议',
tableSetting: '列表设置',
refreshRate: '刷新频率',
noRefresh: '不刷新',
refreshRateUnit: '{0} /',
refreshRateUnit: '不刷新 | {n} / | {n} /',
selectColumn: '选择列',
},
loadingText: {
@ -436,6 +436,7 @@ const message = {
local: '本地',
remote: '远程',
remoteDB: '远程服务器',
manageRemoteDB: '管理远程服务器',
createRemoteDB: '添加远程服务器',
unBindRemoteDB: '解绑远程服务器',
unBindForce: '强制解绑',
@ -951,6 +952,7 @@ const message = {
host: '主机',
createConn: '新建连接',
group: '分组',
manageGroup: '管理@:terminal.group',
noHost: '暂无主机',
groupChange: '切换分组',
expand: '全部展开',
@ -1127,9 +1129,12 @@ const message = {
dir: '文件夹',
upload: '上传',
download: '下载',
uploadFile: '@:file.upload@.lower:file.file',
uploadDirectory: '@:file.upload@.lower:file.dir',
fileName: '文件名',
search: '在当前目录下查找',
mode: '权限',
editPermissions: '编辑@:file.mode',
owner: '所有者',
file: '文件',
remoteFile: '远程下载',
@ -1368,7 +1373,7 @@ const message = {
developerModeHelper: '获取 1Panel 的预览版本以分享有关新功能和更新的反馈',
thirdParty: '第三方账号',
createBackupAccount: '添加 {0}',
addBackupAccount: '添加 {0}',
noTypeForCreate: '当前无可创建备份类型',
LOCAL: '服务器磁盘',
OSS: '阿里云 OSS',
@ -1440,6 +1445,7 @@ const message = {
snapshot: '快照',
deleteHelper: '将删除该快照的所有备份文件包括第三方备份账号中的文件',
ignoreRule: '排除规则',
editIgnoreRule: '@:commons.button.edit@:setting.ignoreRule',
ignoreHelper: '快照时将使用该规则对 1Panel 数据目录进行压缩备份默认忽略套接字文件',
ignoreHelper1: '一行一个 \n*.log\n/opt/1panel/cache',
status: '快照状态',
@ -1792,6 +1798,7 @@ const message = {
ftpHelper: '创建站点的同时为站点创建一个对应 FTP 帐户并且 FTP 目录指向站点所在目录',
remark: '备注',
group: '分组',
manageGroup: '@:website.group',
groupSetting: '分组管理',
createGroup: '创建分组',
app: '应用',
@ -2193,8 +2200,11 @@ const message = {
addressHelper2: '多个 IP IP 请用 "," 隔开172.16.10.11,172.16.0.0/24',
allIP: '所有 IP',
portRule: '端口规则',
createPortRule: '@:commons.button.create@:firewall.portRule',
forwardRule: '端口转发',
createForwardRule: '@:commons.button.create@:firewall.forwardRule',
ipRule: 'IP 规则',
createIpRule: '@:commons.button.create @:firewall.ipRule',
userAgent: 'User-Agent 过滤',
destination: '目的地',
sourcePort: '源端口',

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<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>
<el-row :gutter="5">
<el-col :xs="24" :sm="20" :md="20" :lg="20" :xl="20">

View File

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

View File

@ -9,7 +9,11 @@
<span>{{ $t('container.startIn') }}</span>
</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>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<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>
<span>{{ $t('container.startIn') }}</span>
</el-card>
<LayoutContent :title="$t('container.container')" :class="{ mask: dockerStatus != 'Running' }">
<LayoutContent :title="$t('container.container', 2)" :class="{ mask: dockerStatus != 'Running' }">
<template #rightButton>
<div class="flex justify-end">
<div class="mr-10">
@ -649,7 +649,7 @@ const onOperate = async (op: string, row: Container.ContainerInfo | null) => {
const buttons = [
{
label: i18n.global.t('file.terminal'),
label: i18n.global.t('container.containerTerminal'),
disabled: (row: Container.ContainerInfo) => {
return row.state !== 'running';
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -29,7 +29,7 @@
</el-card>
</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>
<el-radio-group v-model="confShowType" @change="changeMode">
<el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button>

View File

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

View File

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

View File

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

View File

@ -3,17 +3,17 @@
<RouterButton
:buttons="[
{
label: i18n.global.t('cronjob.cronTask'),
label: i18n.global.t('cronjob.cronTask', 2),
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>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3">
<el-button type="primary" @click="onOpenDialog('create')">
{{ $t('commons.button.create') }}{{ $t('cronjob.cronTask') }}
{{ $t('cronjob.create') }}
</el-button>
<el-button-group class="ml-4">
<el-button plain :disabled="selects.length === 0" @click="onBatchChangeStatus('enable')">

View File

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

View File

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

View File

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

View File

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

View File

@ -90,14 +90,10 @@
</el-col>
<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-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">
{{ $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">
{{ $t('home.loadAverage', [15]) }}: {{ formatNumber(currentInfo.load15) }}
{{ $t('home.loadAverage', 15) }}: {{ formatNumber(currentInfo.load15) }}
</el-tag>
<template #reference>
<v-charts

View File

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

View File

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

View File

@ -42,7 +42,11 @@
</el-input>
</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>
<FileRole v-if="setRole" :mode="'0755'" @get-mode="getMode" :key="open.toString()"></FileRole>

View File

@ -94,7 +94,7 @@
{{ $t('file.compress') }}
</el-button>
<el-button plain @click="openBatchRole(selects)" :disabled="selects.length === 0">
{{ $t('file.role') }}
{{ $t('file.editPermissions') }}
</el-button>
<el-button plain @click="batchDelFiles" :disabled="selects.length === 0">
{{ $t('commons.button.delete') }}
@ -102,7 +102,7 @@
</el-button-group>
<el-button class="btn" @click="toTerminal">
{{ $t('menu.terminal') }}
{{ $t('file.terminal') }}
</el-button>
<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) => {
openBatchRole([row]);
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -118,7 +118,7 @@
<el-card style="overflow: inherit">
<template #header>
<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
@change="search('io')"
v-model="timeRangeIO"
@ -149,7 +149,7 @@
<template #header>
<div :class="mobile ? 'flx-wrap' : 'flx-justify-between'">
<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-select @change="search('network')" v-model="networkChoose">
<template #prefix>{{ $t('monitor.networkCard') }}</template>
@ -398,15 +398,15 @@ function initLoadCharts(item: Host.MonitorData) {
xData: loadDate,
yData: [
{
name: '1 ' + i18n.global.t('commons.units.minute'),
name: '1 ' + i18n.global.t('commons.units.minute', 1),
data: load1Data,
},
{
name: '5 ' + i18n.global.t('commons.units.minute'),
name: '5 ' + i18n.global.t('commons.units.minute', 5),
data: load5Data,
},
{
name: '15 ' + i18n.global.t('commons.units.minute'),
name: '15 ' + i18n.global.t('commons.units.minute', 15),
data: load15Data,
},
{
@ -416,7 +416,7 @@ function initLoadCharts(item: Host.MonitorData) {
},
],
yAxis: [
{ type: 'value', name: i18n.global.t('monitor.loadDetail') + ' ( % )' },
{ type: 'value', name: i18n.global.t('monitor.loadDetail') },
{
type: 'value',
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,
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.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')) {
res +=
item.marker +
' ' +
item.seriesName +
'' +
i18n.global.t('commons.colon') +
item.data +
' ' +
i18n.global.t('commons.units.time') +
@ -496,7 +517,14 @@ function initIOCharts(item: Host.MonitorData) {
'<br/>';
}
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;

View File

@ -2,7 +2,7 @@
<div>
<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>
<el-form :model="form" @submit.prevent ref="panelFormRef" label-position="left" label-width="160px">
<el-row>

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<template>
<div>
<LayoutContent v-loading="loading" :title="$t('ssh.loginLogs')">
<LayoutContent v-loading="loading" :title="$t('ssh.loginLogs', 2)">
<template #prompt>
<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>

View File

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

View File

@ -52,7 +52,7 @@
</el-card>
</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>
<el-radio-group v-model="confShowType" @change="changeMode">
<el-radio-button value="base">{{ $t('database.baseConf') }}</el-radio-button>

View File

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

View File

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

View File

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

View File

@ -102,7 +102,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -158,7 +158,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -215,7 +215,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -277,7 +277,7 @@
type="primary"
@click="onOpenDialog('create', 'OneDrive')"
>
{{ $t('setting.createBackupAccount', [$t('setting.OneDrive')]) }}
{{ $t('setting.addBackupAccount', [$t('setting.OneDrive')]) }}
</el-button>
</el-alert>
</el-col>
@ -321,7 +321,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -362,7 +362,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -405,7 +405,7 @@
</div>
<el-alert v-else center class="alert" style="height: 257px" :closable="false">
<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-alert>
</el-col>
@ -449,7 +449,7 @@
type="primary"
@click="onOpenDialog('create', 'WebDAV')"
>
{{ $t('setting.createBackupAccount', ['WebDAV']) }}
{{ $t('setting.addBackupAccount', ['WebDAV']) }}
</el-button>
</el-alert>
</el-col>

View File

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

View File

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

View File

@ -1,6 +1,6 @@
<template>
<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>
<div class="flex justify-between gap-2 flex-wrap sm:flex-row">
<div class="flex flex-wrap gap-3">
@ -11,7 +11,7 @@
{{ $t('setting.importSnapshot') }}
</el-button>
<el-button type="primary" plain @click="onIgnore()">
{{ $t('setting.ignoreRule') }}
{{ $t('setting.editIgnoreRule') }}
</el-button>
<el-button type="primary" plain :disabled="selects.length === 0" @click="batchDelete(null)">
{{ $t('commons.button.delete') }}

View File

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

View File

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

View File

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

View File

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