Benches菜单增加多语言支持
This commit is contained in:
parent
bdb0e583aa
commit
fc4152cf19
@ -76,7 +76,7 @@ export default {
|
|||||||
disabled: enforce2FA,
|
disabled: enforce2FA,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '工作台',
|
name: this.$t('Benches'),
|
||||||
icon: () => h(Package),
|
icon: () => h(Package),
|
||||||
route: '/benches',
|
route: '/benches',
|
||||||
isActive: routeName.startsWith('Bench'),
|
isActive: routeName.startsWith('Bench'),
|
||||||
@ -84,7 +84,7 @@ export default {
|
|||||||
disabled: !onboardingComplete || enforce2FA,
|
disabled: !onboardingComplete || enforce2FA,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '站点分组',
|
name: this.$t('Release Group'),
|
||||||
icon: () => h(Boxes),
|
icon: () => h(Boxes),
|
||||||
route: '/groups',
|
route: '/groups',
|
||||||
isActive:
|
isActive:
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import type {
|
|||||||
} from './common/types';
|
} from './common/types';
|
||||||
import { getLogsTab } from './tabs/site/logs';
|
import { getLogsTab } from './tabs/site/logs';
|
||||||
import { getPatchesTab } from './common/patches';
|
import { getPatchesTab } from './common/patches';
|
||||||
|
import { t } from '../utils/i18n';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
pagetype: 'Bench',
|
pagetype: 'Bench',
|
||||||
@ -45,11 +46,11 @@ function getDetail() {
|
|||||||
const team = getTeam();
|
const team = getTeam();
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '选项',
|
label: t('Options'),
|
||||||
condition: () => team.pg?.is_desk_user ?? false,
|
condition: () => team.pg?.is_desk_user ?? false,
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
label: '在 Desk 中查看',
|
label: t('View in Desk'),
|
||||||
icon: icon('external-link'),
|
icon: icon('external-link'),
|
||||||
condition: () => team.pg?.is_desk_user,
|
condition: () => team.pg?.is_desk_user,
|
||||||
onClick() {
|
onClick() {
|
||||||
@ -60,7 +61,7 @@ function getDetail() {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '模拟团队',
|
label: t('Impersonate Team'),
|
||||||
icon: defineAsyncComponent(
|
icon: defineAsyncComponent(
|
||||||
() => import('~icons/lucide/venetian-mask')
|
() => import('~icons/lucide/venetian-mask')
|
||||||
),
|
),
|
||||||
@ -106,7 +107,7 @@ function getRoutes() {
|
|||||||
function getList() {
|
function getList() {
|
||||||
return {
|
return {
|
||||||
route: '/benches',
|
route: '/benches',
|
||||||
title: '工作台',
|
title: t('Benches'),
|
||||||
fields: [
|
fields: [
|
||||||
'group.title as group_title',
|
'group.title as group_title',
|
||||||
'cluster.name as cluster_name',
|
'cluster.name as cluster_name',
|
||||||
@ -117,32 +118,32 @@ function getList() {
|
|||||||
searchField: 'name',
|
searchField: 'name',
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '工作台',
|
label: t('Benches'),
|
||||||
fieldname: 'name',
|
fieldname: 'name',
|
||||||
class: 'font-medium',
|
class: 'font-medium',
|
||||||
suffix: getBenchTitleSuffix
|
suffix: getBenchTitleSuffix
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
fieldname: 'status',
|
fieldname: 'status',
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: '100px'
|
width: '100px'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '站点',
|
label: t('Sites'),
|
||||||
fieldname: 'site_count',
|
fieldname: 'site_count',
|
||||||
type: 'Number',
|
type: 'Number',
|
||||||
width: '100px',
|
width: '100px',
|
||||||
align: 'right'
|
align: 'right'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '区域',
|
label: t('Region'),
|
||||||
fieldname: 'cluster',
|
fieldname: 'cluster',
|
||||||
width: 0.75,
|
width: 0.75,
|
||||||
format: (value, row) => String(row.cluster_title || value || ''),
|
format: (value, row) => String(row.cluster_title || value || ''),
|
||||||
prefix: getClusterImagePrefix
|
prefix: getClusterImagePrefix
|
||||||
},
|
},
|
||||||
{ label: '站点分组', fieldname: 'group_title', width: '350px' }
|
{ label: t('Release Group'), fieldname: 'group_title', width: '350px' }
|
||||||
],
|
],
|
||||||
filterControls
|
filterControls
|
||||||
} satisfies List as List;
|
} satisfies List as List;
|
||||||
@ -167,9 +168,9 @@ function getInPlaceUpdatesSuffix(row: Row) {
|
|||||||
String(row.inplace_update_docker_image).split('-').at(-1)
|
String(row.inplace_update_docker_image).split('-').at(-1)
|
||||||
);
|
);
|
||||||
|
|
||||||
let title = '工作台已就地更新';
|
let title = t('Bench has been updated in place');
|
||||||
if (!Number.isNaN(count) && count > 1) {
|
if (!Number.isNaN(count) && count > 1) {
|
||||||
title += ` ${count} 次`;
|
title += ` ${count} ${t('times')}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return h(
|
return h(
|
||||||
@ -186,7 +187,7 @@ function getAppPatchSuffix(row: Row) {
|
|||||||
return h(
|
return h(
|
||||||
'div',
|
'div',
|
||||||
{
|
{
|
||||||
title: '此工作台中的应用可能已打补丁',
|
title: t('Apps in this bench may have been patched'),
|
||||||
class: 'rounded-full bg-gray-100 p-1'
|
class: 'rounded-full bg-gray-100 p-1'
|
||||||
},
|
},
|
||||||
h(icon('hash', 'w-3 h-3'))
|
h(icon('hash', 'w-3 h-3'))
|
||||||
@ -207,21 +208,21 @@ function filterControls() {
|
|||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
fieldname: 'status',
|
fieldname: 'status',
|
||||||
options: [
|
options: [
|
||||||
{ label: '', value: '' },
|
{ label: '', value: '' },
|
||||||
{ label: '激活', value: 'Active' },
|
{ label: t('Active'), value: 'Active' },
|
||||||
{ label: '待定', value: 'Pending' },
|
{ label: t('Pending'), value: 'Pending' },
|
||||||
{ label: '安装中', value: 'Installing' },
|
{ label: t('Installing'), value: 'Installing' },
|
||||||
{ label: '更新中', value: 'Updating' },
|
{ label: t('Updating'), value: 'Updating' },
|
||||||
{ label: '损坏', value: 'Broken' },
|
{ label: t('Broken'), value: 'Broken' },
|
||||||
{ label: '已归档', value: 'Archived' }
|
{ label: t('Archived'), value: 'Archived' }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'link',
|
type: 'link',
|
||||||
label: '站点分组',
|
label: t('Release Group'),
|
||||||
fieldname: 'group',
|
fieldname: 'group',
|
||||||
options: {
|
options: {
|
||||||
pagetype: 'Release Group'
|
pagetype: 'Release Group'
|
||||||
@ -229,7 +230,7 @@ function filterControls() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '区域',
|
label: t('Region'),
|
||||||
fieldname: 'cluster',
|
fieldname: 'cluster',
|
||||||
options: clusterOptions
|
options: clusterOptions
|
||||||
}
|
}
|
||||||
@ -238,7 +239,7 @@ function filterControls() {
|
|||||||
|
|
||||||
export function getSitesTab() {
|
export function getSitesTab() {
|
||||||
return {
|
return {
|
||||||
label: '站点',
|
label: t('Sites'),
|
||||||
icon: icon(LucideAppWindow),
|
icon: icon(LucideAppWindow),
|
||||||
route: 'sites',
|
route: 'sites',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -266,7 +267,7 @@ export function getSitesTab() {
|
|||||||
route: sitesTabRoute,
|
route: sitesTabRoute,
|
||||||
primaryAction: r => {
|
primaryAction: r => {
|
||||||
return {
|
return {
|
||||||
label: '新建站点',
|
label: t('New Site'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus', 'w-4 h-4')
|
prefix: icon('plus', 'w-4 h-4')
|
||||||
},
|
},
|
||||||
@ -278,7 +279,7 @@ export function getSitesTab() {
|
|||||||
},
|
},
|
||||||
rowActions: ({ row }) => [
|
rowActions: ({ row }) => [
|
||||||
{
|
{
|
||||||
label: '在桌面查看',
|
label: t('View in Desk'),
|
||||||
condition: () => getTeam()?.pg?.is_desk_user,
|
condition: () => getTeam()?.pg?.is_desk_user,
|
||||||
onClick() {
|
onClick() {
|
||||||
window.open(
|
window.open(
|
||||||
@ -295,7 +296,7 @@ export function getSitesTab() {
|
|||||||
export function getProcessesTab() {
|
export function getProcessesTab() {
|
||||||
const url = 'jcloud.api.bench.get_processes';
|
const url = 'jcloud.api.bench.get_processes';
|
||||||
return {
|
return {
|
||||||
label: '进程',
|
label: t('Processes'),
|
||||||
icon: icon('cpu'),
|
icon: icon('cpu'),
|
||||||
route: 'processes',
|
route: 'processes',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -331,18 +332,18 @@ export function getProcessesColumns() {
|
|||||||
type Status = keyof typeof processStatusColorMap;
|
type Status = keyof typeof processStatusColorMap;
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '名称',
|
label: t('Name'),
|
||||||
width: 2,
|
width: 2,
|
||||||
fieldname: 'name'
|
fieldname: 'name'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '组',
|
label: t('Group'),
|
||||||
width: 1.5,
|
width: 1.5,
|
||||||
fieldname: 'group',
|
fieldname: 'group',
|
||||||
format: v => String(v ?? '')
|
format: v => String(v ?? '')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: 0.7,
|
width: 0.7,
|
||||||
fieldname: 'status',
|
fieldname: 'status',
|
||||||
@ -363,7 +364,7 @@ width: 1.5,
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '运行时间',
|
label: t('Uptime'),
|
||||||
fieldname: 'uptime_string'
|
fieldname: 'uptime_string'
|
||||||
}
|
}
|
||||||
] satisfies ColumnField[] as ColumnField[];
|
] satisfies ColumnField[] as ColumnField[];
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import { date, duration } from '../utils/format';
|
|||||||
import { getJobsTab } from './common/jobs';
|
import { getJobsTab } from './common/jobs';
|
||||||
import { getPatchesTab } from './common/patches';
|
import { getPatchesTab } from './common/patches';
|
||||||
import { tagTab } from './common/tags';
|
import { tagTab } from './common/tags';
|
||||||
|
import { t } from '../utils/i18n';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
pagetype: 'Release Group',
|
pagetype: 'Release Group',
|
||||||
@ -41,14 +42,14 @@ export default {
|
|||||||
},
|
},
|
||||||
list: {
|
list: {
|
||||||
route: '/groups',
|
route: '/groups',
|
||||||
title: '站点分组',
|
title: t('Release Group'),
|
||||||
fields: [{ apps: ['app'] }],
|
fields: [{ apps: ['app'] }],
|
||||||
searchField: 'title',
|
searchField: 'title',
|
||||||
filterControls() {
|
filterControls() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
type: 'link',
|
type: 'link',
|
||||||
label: '版本',
|
label: t('Version'),
|
||||||
fieldname: 'version',
|
fieldname: 'version',
|
||||||
options: {
|
options: {
|
||||||
pagetype: 'Jingrow Version'
|
pagetype: 'Jingrow Version'
|
||||||
@ -56,7 +57,7 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'link',
|
type: 'link',
|
||||||
label: '标签',
|
label: t('Tag'),
|
||||||
fieldname: 'tags.tag',
|
fieldname: 'tags.tag',
|
||||||
options: {
|
options: {
|
||||||
pagetype: 'Jcloud Tag',
|
pagetype: 'Jcloud Tag',
|
||||||
@ -68,24 +69,24 @@ export default {
|
|||||||
];
|
];
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{ label: '标题', fieldname: 'title', class: 'font-medium' },
|
{ label: t('Title'), fieldname: 'title', class: 'font-medium' },
|
||||||
{
|
{
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
fieldname: 'active_benches',
|
fieldname: 'active_benches',
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: 0.5,
|
width: 0.5,
|
||||||
format: (value, row) => {
|
format: (value, row) => {
|
||||||
if (!value) return '等待部署';
|
if (!value) return t('Waiting for Deployment');
|
||||||
else return '激活';
|
else return t('Active');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '版本',
|
label: t('Version'),
|
||||||
fieldname: 'version',
|
fieldname: 'version',
|
||||||
width: 0.5
|
width: 0.5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '应用',
|
label: t('App'),
|
||||||
fieldname: 'app',
|
fieldname: 'app',
|
||||||
format: (value, row) => {
|
format: (value, row) => {
|
||||||
return (row.apps || []).map(d => d.app).join(', ');
|
return (row.apps || []).map(d => d.app).join(', ');
|
||||||
@ -93,7 +94,7 @@ export default {
|
|||||||
width: '25rem'
|
width: '25rem'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '站点',
|
label: t('Sites'),
|
||||||
fieldname: 'site_count',
|
fieldname: 'site_count',
|
||||||
class: 'text-gray-600',
|
class: 'text-gray-600',
|
||||||
width: 0.25
|
width: 0.25
|
||||||
@ -101,7 +102,7 @@ export default {
|
|||||||
],
|
],
|
||||||
primaryAction() {
|
primaryAction() {
|
||||||
return {
|
return {
|
||||||
label: '新建站点分组',
|
label: t('New Release Group'),
|
||||||
variant: 'solid',
|
variant: 'solid',
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus')
|
prefix: icon('plus')
|
||||||
@ -142,7 +143,7 @@ export default {
|
|||||||
route: '/groups/:name',
|
route: '/groups/:name',
|
||||||
tabs: [
|
tabs: [
|
||||||
{
|
{
|
||||||
label: '站点',
|
label: t('Sites'),
|
||||||
icon: icon(LucideAppWindow),
|
icon: icon(LucideAppWindow),
|
||||||
route: 'sites',
|
route: 'sites',
|
||||||
type: 'Component',
|
type: 'Component',
|
||||||
@ -154,7 +155,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '应用',
|
label: t('App'),
|
||||||
icon: icon('grid'),
|
icon: icon('grid'),
|
||||||
route: 'apps',
|
route: 'apps',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -169,12 +170,12 @@ export default {
|
|||||||
pageLength: 99999,
|
pageLength: 99999,
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '应用',
|
label: t('App'),
|
||||||
fieldname: 'title',
|
fieldname: 'title',
|
||||||
width: 1
|
width: 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '仓库',
|
label: t('Repository'),
|
||||||
width: 1,
|
width: 1,
|
||||||
format(value, row) {
|
format(value, row) {
|
||||||
return `${row.repository_owner}/${row.repository}`;
|
return `${row.repository_owner}/${row.repository}`;
|
||||||
@ -184,7 +185,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '分支',
|
label: t('Branch'),
|
||||||
fieldname: 'branch',
|
fieldname: 'branch',
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: 0.5,
|
width: 0.5,
|
||||||
@ -193,7 +194,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '版本',
|
label: t('Version'),
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
fieldname: 'tag',
|
fieldname: 'tag',
|
||||||
width: 0.5,
|
width: 0.5,
|
||||||
@ -202,7 +203,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
suffix(row) {
|
suffix(row) {
|
||||||
if (!row.last_github_poll_failed) return;
|
if (!row.last_github_poll_failed) return;
|
||||||
@ -210,7 +211,7 @@ export default {
|
|||||||
return h(
|
return h(
|
||||||
Tooltip,
|
Tooltip,
|
||||||
{
|
{
|
||||||
text: "这是什么?",
|
text: t("What is this?"),
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
class: 'rounded-full bg-gray-100 p-1'
|
class: 'rounded-full bg-gray-100 p-1'
|
||||||
},
|
},
|
||||||
@ -231,12 +232,12 @@ export default {
|
|||||||
row;
|
row;
|
||||||
|
|
||||||
return last_github_poll_failed
|
return last_github_poll_failed
|
||||||
? '需要操作'
|
? t('Action Required')
|
||||||
: !deployed
|
: !deployed
|
||||||
? '未部署'
|
? t('Not Deployed')
|
||||||
: update_available
|
: update_available
|
||||||
? '有可用更新'
|
? t('Update Available')
|
||||||
: '最新版本';
|
: t('Latest Version');
|
||||||
},
|
},
|
||||||
width: 0.5
|
width: 0.5
|
||||||
}
|
}
|
||||||
@ -249,7 +250,7 @@ export default {
|
|||||||
let team = getTeam();
|
let team = getTeam();
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '在桌面查看',
|
label: t('View in Desk'),
|
||||||
condition: () => team.pg?.is_desk_user,
|
condition: () => team.pg?.is_desk_user,
|
||||||
onClick() {
|
onClick() {
|
||||||
window.open(
|
window.open(
|
||||||
@ -259,17 +260,17 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '获取最新更新',
|
label: t('Fetch Latest Updates'),
|
||||||
onClick() {
|
onClick() {
|
||||||
toast.promise(
|
toast.promise(
|
||||||
releaseGroup.fetchLatestAppUpdates.submit({
|
releaseGroup.fetchLatestAppUpdates.submit({
|
||||||
app: row.name
|
app: row.name
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
loading: `正在为 ${row.title} 获取最新更新...`,
|
loading: t('Fetching latest updates for {app}...', { app: row.title }),
|
||||||
success: () => {
|
success: () => {
|
||||||
apps.reload();
|
apps.reload();
|
||||||
return `已为 ${row.title} 获取最新更新`;
|
return t('Latest updates fetched for {app}', { app: row.title });
|
||||||
},
|
},
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
}
|
}
|
||||||
@ -277,7 +278,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '更改分支',
|
label: t('Change Branch'),
|
||||||
onClick() {
|
onClick() {
|
||||||
renderDialog(
|
renderDialog(
|
||||||
h(ChangeAppBranchDialog, {
|
h(ChangeAppBranchDialog, {
|
||||||
@ -291,24 +292,24 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '移除应用',
|
label: t('Remove App'),
|
||||||
condition: () => row.name !== 'jingrow',
|
condition: () => row.name !== 'jingrow',
|
||||||
onClick() {
|
onClick() {
|
||||||
if (releaseGroup.removeApp.loading) return;
|
if (releaseGroup.removeApp.loading) return;
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '移除应用',
|
title: t('Remove App'),
|
||||||
message: `确定要移除应用 <b>${row.title}</b> 吗?`,
|
message: t('Are you sure you want to remove app <b>{app}</b>?', { app: row.title }),
|
||||||
onSuccess: ({ hide }) => {
|
onSuccess: ({ hide }) => {
|
||||||
toast.promise(
|
toast.promise(
|
||||||
releaseGroup.removeApp.submit({
|
releaseGroup.removeApp.submit({
|
||||||
app: row.name
|
app: row.name
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
loading: '正在移除应用...',
|
loading: t('Removing app...'),
|
||||||
success: () => {
|
success: () => {
|
||||||
hide();
|
hide();
|
||||||
apps.reload();
|
apps.reload();
|
||||||
return '应用已移除';
|
return t('App removed');
|
||||||
},
|
},
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
}
|
}
|
||||||
@ -318,7 +319,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '访问仓库',
|
label: t('Visit Repository'),
|
||||||
onClick() {
|
onClick() {
|
||||||
window.open(
|
window.open(
|
||||||
`${row.repository_url}/tree/${row.branch}`,
|
`${row.repository_url}/tree/${row.branch}`,
|
||||||
@ -327,7 +328,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '应用补丁',
|
label: t('Apply Patch'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
renderDialog(
|
renderDialog(
|
||||||
h(PatchAppDialog, {
|
h(PatchAppDialog, {
|
||||||
@ -344,7 +345,7 @@ export default {
|
|||||||
documentResource: releaseGroup
|
documentResource: releaseGroup
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
label: '添加应用',
|
label: t('Add App'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus')
|
prefix: icon('plus')
|
||||||
},
|
},
|
||||||
@ -358,8 +359,8 @@ export default {
|
|||||||
},
|
},
|
||||||
onNewApp(app, isUpdate) {
|
onNewApp(app, isUpdate) {
|
||||||
const loading = isUpdate
|
const loading = isUpdate
|
||||||
? '替换应用中...'
|
? t('Replacing app...')
|
||||||
: '添加应用中...';
|
: t('Adding app...');
|
||||||
|
|
||||||
toast.promise(
|
toast.promise(
|
||||||
releaseGroup.addApp.submit({
|
releaseGroup.addApp.submit({
|
||||||
@ -373,10 +374,10 @@ export default {
|
|||||||
releaseGroup.reload();
|
releaseGroup.reload();
|
||||||
|
|
||||||
if (isUpdate) {
|
if (isUpdate) {
|
||||||
return `应用 ${app.title} 已更新`;
|
return t('App {app} updated', { app: app.title });
|
||||||
}
|
}
|
||||||
|
|
||||||
return `应用 ${app.title} 已添加`;
|
return t('App {app} added', { app: app.title });
|
||||||
},
|
},
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
}
|
}
|
||||||
@ -390,7 +391,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '部署',
|
label: t('Deploy'),
|
||||||
route: 'deploys',
|
route: 'deploys',
|
||||||
icon: icon('package'),
|
icon: icon('package'),
|
||||||
childrenRoutes: ['Deploy Candidate'],
|
childrenRoutes: ['Deploy Candidate'],
|
||||||
@ -412,7 +413,7 @@ export default {
|
|||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
type: 'select',
|
type: 'select',
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
fieldname: 'status',
|
fieldname: 'status',
|
||||||
options: [
|
options: [
|
||||||
'',
|
'',
|
||||||
@ -431,7 +432,7 @@ export default {
|
|||||||
if (releaseGroup.pg.are_builds_suspended) {
|
if (releaseGroup.pg.are_builds_suspended) {
|
||||||
return {
|
return {
|
||||||
title:
|
title:
|
||||||
'<b>构建已暂停:</b>更新将在构建恢复后计划运行。',
|
t('<b>Builds suspended:</b> Updates will be scheduled after builds resume.'),
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
@ -440,15 +441,15 @@ export default {
|
|||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '部署',
|
label: t('Deploy'),
|
||||||
fieldname: 'creation',
|
fieldname: 'creation',
|
||||||
format(value) {
|
format(value) {
|
||||||
return `部署于 ${date(value, 'llll')}`;
|
return t('Deployed at {date}', { date: date(value, 'llll') });
|
||||||
},
|
},
|
||||||
width: '20rem'
|
width: '20rem'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '状态',
|
label: t('Status'),
|
||||||
fieldname: 'status',
|
fieldname: 'status',
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: 0.5,
|
width: 0.5,
|
||||||
@ -460,7 +461,7 @@ export default {
|
|||||||
return h(
|
return h(
|
||||||
Tooltip,
|
Tooltip,
|
||||||
{
|
{
|
||||||
text: '需要关注!',
|
text: t('Attention required!'),
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
class: 'rounded-full bg-gray-100 p-1'
|
class: 'rounded-full bg-gray-100 p-1'
|
||||||
},
|
},
|
||||||
@ -469,35 +470,35 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '应用',
|
label: t('App'),
|
||||||
format(value, row) {
|
format(value, row) {
|
||||||
return (row.apps || []).map(d => d.app).join(', ');
|
return (row.apps || []).map(d => d.app).join(', ');
|
||||||
},
|
},
|
||||||
width: '20rem'
|
width: '20rem'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '持续时间',
|
label: t('Duration'),
|
||||||
fieldname: 'build_duration',
|
fieldname: 'build_duration',
|
||||||
format: duration,
|
format: duration,
|
||||||
class: 'text-gray-600',
|
class: 'text-gray-600',
|
||||||
width: 1
|
width: 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '部署者',
|
label: t('Deployer'),
|
||||||
fieldname: 'owner',
|
fieldname: 'owner',
|
||||||
width: 1
|
width: 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
primaryAction({ listResource: deploys, documentResource: group }) {
|
primaryAction({ listResource: deploys, documentResource: group }) {
|
||||||
return {
|
return {
|
||||||
label: '部署',
|
label: t('Deploy'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon(LucideRocket)
|
prefix: icon(LucideRocket)
|
||||||
},
|
},
|
||||||
onClick() {
|
onClick() {
|
||||||
if (group.pg.deploy_information.deploy_in_progress) {
|
if (group.pg.deploy_information.deploy_in_progress) {
|
||||||
return toast.error(
|
return toast.error(
|
||||||
'部署正在进行中。请等待其完成。'
|
t('Deployment in progress. Please wait for it to complete.')
|
||||||
);
|
);
|
||||||
} else if (group.pg.deploy_information.update_available) {
|
} else if (group.pg.deploy_information.update_available) {
|
||||||
let UpdateReleaseGroupDialog = defineAsyncComponent(() =>
|
let UpdateReleaseGroupDialog = defineAsyncComponent(() =>
|
||||||
@ -517,16 +518,16 @@ export default {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '无需应用更新即可部署?',
|
title: t('Deploy without app updates?'),
|
||||||
message:
|
message:
|
||||||
'未检测到应用更新。部署时将应用依赖项和环境变量的更改。',
|
t('No app updates detected. Deployment will apply dependency and environment variable changes.'),
|
||||||
onSuccess: ({ hide }) => {
|
onSuccess: ({ hide }) => {
|
||||||
toast.promise(group.redeploy.submit(), {
|
toast.promise(group.redeploy.submit(), {
|
||||||
loading: '正在部署...',
|
loading: t('Deploying...'),
|
||||||
success: () => {
|
success: () => {
|
||||||
hide();
|
hide();
|
||||||
deploys.reload();
|
deploys.reload();
|
||||||
return '更改已部署';
|
return t('Changes deployed');
|
||||||
},
|
},
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
});
|
});
|
||||||
@ -540,7 +541,7 @@ export default {
|
|||||||
},
|
},
|
||||||
getJobsTab('Release Group'),
|
getJobsTab('Release Group'),
|
||||||
{
|
{
|
||||||
label: '配置',
|
label: t('Config'),
|
||||||
icon: icon('settings'),
|
icon: icon('settings'),
|
||||||
route: 'bench-config',
|
route: 'bench-config',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -557,7 +558,7 @@ export default {
|
|||||||
pageLength: 999,
|
pageLength: 999,
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '配置名称',
|
label: t('Config Name'),
|
||||||
fieldname: 'key',
|
fieldname: 'key',
|
||||||
format(value, row) {
|
format(value, row) {
|
||||||
if (row.title) {
|
if (row.title) {
|
||||||
@ -567,12 +568,12 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '配置值',
|
label: t('Config Value'),
|
||||||
fieldname: 'value',
|
fieldname: 'value',
|
||||||
class: 'font-mono'
|
class: 'font-mono'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '类型',
|
label: t('Type'),
|
||||||
fieldname: 'type',
|
fieldname: 'type',
|
||||||
type: 'Badge',
|
type: 'Badge',
|
||||||
width: '100px'
|
width: '100px'
|
||||||
@ -583,7 +584,7 @@ export default {
|
|||||||
documentResource: releaseGroup
|
documentResource: releaseGroup
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
label: '添加配置',
|
label: t('Add Config'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus')
|
prefix: icon('plus')
|
||||||
},
|
},
|
||||||
@ -604,7 +605,7 @@ export default {
|
|||||||
},
|
},
|
||||||
secondaryAction({ listResource: configs }) {
|
secondaryAction({ listResource: configs }) {
|
||||||
return {
|
return {
|
||||||
label: '预览',
|
label: t('Preview'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('eye')
|
prefix: icon('eye')
|
||||||
},
|
},
|
||||||
@ -627,7 +628,7 @@ export default {
|
|||||||
}) {
|
}) {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '编辑',
|
label: t('Edit'),
|
||||||
onClick() {
|
onClick() {
|
||||||
let ConfigEditorDialog = defineAsyncComponent(() =>
|
let ConfigEditorDialog = defineAsyncComponent(() =>
|
||||||
import('../components/ConfigEditorDialog.vue')
|
import('../components/ConfigEditorDialog.vue')
|
||||||
@ -644,11 +645,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '删除',
|
label: t('Delete'),
|
||||||
onClick() {
|
onClick() {
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '删除配置',
|
title: t('Delete Config'),
|
||||||
message: `确定要删除配置 <b>${row.key}</b> 吗?`,
|
message: t('Are you sure you want to delete config <b>{key}</b>?', { key: row.key }),
|
||||||
onSuccess({ hide }) {
|
onSuccess({ hide }) {
|
||||||
if (releaseGroup.deleteConfig.loading) return;
|
if (releaseGroup.deleteConfig.loading) return;
|
||||||
toast.promise(
|
toast.promise(
|
||||||
@ -662,8 +663,8 @@ export default {
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
loading: '正在删除配置...',
|
loading: t('Deleting config...'),
|
||||||
success: () => `配置 ${row.key} 已删除`,
|
success: () => t('Config {key} deleted', { key: row.key }),
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -676,7 +677,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '操作',
|
label: t('Actions'),
|
||||||
icon: icon('sliders'),
|
icon: icon('sliders'),
|
||||||
route: 'actions',
|
route: 'actions',
|
||||||
type: 'Component',
|
type: 'Component',
|
||||||
@ -688,7 +689,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '区域',
|
label: t('Region'),
|
||||||
icon: icon('globe'),
|
icon: icon('globe'),
|
||||||
route: 'regions',
|
route: 'regions',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -699,11 +700,11 @@ export default {
|
|||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '区域',
|
label: t('Region'),
|
||||||
fieldname: 'title'
|
fieldname: 'title'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '国家',
|
label: t('Country'),
|
||||||
fieldname: 'image',
|
fieldname: 'image',
|
||||||
format(value, row) {
|
format(value, row) {
|
||||||
return '';
|
return '';
|
||||||
@ -722,7 +723,7 @@ export default {
|
|||||||
documentResource: releaseGroup
|
documentResource: releaseGroup
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
label: '添加区域',
|
label: t('Add Region'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus')
|
prefix: icon('plus')
|
||||||
},
|
},
|
||||||
@ -745,7 +746,7 @@ export default {
|
|||||||
},
|
},
|
||||||
getPatchesTab(false),
|
getPatchesTab(false),
|
||||||
{
|
{
|
||||||
label: '依赖项',
|
label: t('Dependencies'),
|
||||||
icon: icon('box'),
|
icon: icon('box'),
|
||||||
route: 'bench-dependencies',
|
route: 'bench-dependencies',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -759,14 +760,14 @@ export default {
|
|||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '依赖项',
|
label: t('Dependencies'),
|
||||||
fieldname: 'dependency',
|
fieldname: 'dependency',
|
||||||
format(value, row) {
|
format(value, row) {
|
||||||
return row.title;
|
return row.title;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '版本',
|
label: t('Version'),
|
||||||
fieldname: 'version',
|
fieldname: 'version',
|
||||||
suffix(row) {
|
suffix(row) {
|
||||||
if (!row.is_custom) {
|
if (!row.is_custom) {
|
||||||
@ -776,7 +777,7 @@ export default {
|
|||||||
return h(
|
return h(
|
||||||
Tooltip,
|
Tooltip,
|
||||||
{
|
{
|
||||||
text: '自定义版本',
|
text: t('Custom Version'),
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
class: 'rounded-full bg-gray-100 p-1'
|
class: 'rounded-full bg-gray-100 p-1'
|
||||||
},
|
},
|
||||||
@ -792,7 +793,7 @@ export default {
|
|||||||
}) {
|
}) {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '编辑',
|
label: t('Edit'),
|
||||||
onClick() {
|
onClick() {
|
||||||
let DependencyEditorDialog = defineAsyncComponent(() =>
|
let DependencyEditorDialog = defineAsyncComponent(() =>
|
||||||
import('../components/group/DependencyEditorDialog.vue')
|
import('../components/group/DependencyEditorDialog.vue')
|
||||||
@ -813,7 +814,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '环境',
|
label: t('Environment'),
|
||||||
icon: icon('tool'),
|
icon: icon('tool'),
|
||||||
route: 'bench-environment-variable',
|
route: 'bench-environment-variable',
|
||||||
type: 'list',
|
type: 'list',
|
||||||
@ -829,11 +830,11 @@ export default {
|
|||||||
fields: ['name'],
|
fields: ['name'],
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
label: '环境变量名称',
|
label: t('Environment Variable Name'),
|
||||||
fieldname: 'key'
|
fieldname: 'key'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '环境变量值',
|
label: t('Environment Variable Value'),
|
||||||
fieldname: 'value'
|
fieldname: 'value'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@ -842,7 +843,7 @@ export default {
|
|||||||
documentResource: releaseGroup
|
documentResource: releaseGroup
|
||||||
}) {
|
}) {
|
||||||
return {
|
return {
|
||||||
label: '添加环境变量',
|
label: t('Add Environment Variable'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: icon('plus')
|
prefix: icon('plus')
|
||||||
},
|
},
|
||||||
@ -868,7 +869,7 @@ export default {
|
|||||||
}) {
|
}) {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '编辑',
|
label: t('Edit'),
|
||||||
onClick() {
|
onClick() {
|
||||||
let ConfigEditorDialog = defineAsyncComponent(() =>
|
let ConfigEditorDialog = defineAsyncComponent(() =>
|
||||||
import('../components/EnvironmentVariableEditorDialog.vue')
|
import('../components/EnvironmentVariableEditorDialog.vue')
|
||||||
@ -885,11 +886,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '删除',
|
label: t('Delete'),
|
||||||
onClick() {
|
onClick() {
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '删除环境变量',
|
title: t('Delete Environment Variable'),
|
||||||
message: `确定要删除环境变量 <b>${row.key}</b> 吗?`,
|
message: t('Are you sure you want to delete environment variable <b>{key}</b>?', { key: row.key }),
|
||||||
onSuccess({ hide }) {
|
onSuccess({ hide }) {
|
||||||
if (releaseGroup.deleteEnvironmentVariable.loading)
|
if (releaseGroup.deleteEnvironmentVariable.loading)
|
||||||
return;
|
return;
|
||||||
@ -904,9 +905,9 @@ export default {
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
loading: '正在删除环境变量...',
|
loading: t('Deleting environment variable...'),
|
||||||
success: () =>
|
success: () =>
|
||||||
`环境变量 ${row.key} 已删除`,
|
t('Environment variable {key} deleted', { key: row.key }),
|
||||||
error: e => getToastErrorMessage(e)
|
error: e => getToastErrorMessage(e)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@ -926,8 +927,8 @@ export default {
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: '模拟组所有者',
|
label: t('Impersonate Group Owner'),
|
||||||
title: '模拟组所有者',
|
title: t('Impersonate Group Owner'),
|
||||||
slots: {
|
slots: {
|
||||||
icon: defineAsyncComponent(() =>
|
icon: defineAsyncComponent(() =>
|
||||||
import('~icons/lucide/venetian-mask')
|
import('~icons/lucide/venetian-mask')
|
||||||
@ -941,8 +942,8 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: group.pg?.deploy_information?.last_deploy
|
label: group.pg?.deploy_information?.last_deploy
|
||||||
? '有可用更新'
|
? t('Update Available')
|
||||||
: '立即部署',
|
: t('Deploy Now'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: group.pg?.deploy_information?.last_deploy
|
prefix: group.pg?.deploy_information?.last_deploy
|
||||||
? icon(LucideHardDriveDownload)
|
? icon(LucideHardDriveDownload)
|
||||||
@ -971,8 +972,8 @@ export default {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
confirmDialog({
|
confirmDialog({
|
||||||
title: '部署',
|
title: t('Deploy'),
|
||||||
message: "立即部署吗?",
|
message: t("Deploy now?"),
|
||||||
onSuccess({ hide }) {
|
onSuccess({ hide }) {
|
||||||
toast.promise(
|
toast.promise(
|
||||||
group.initialDeploy.submit(null, {
|
group.initialDeploy.submit(null, {
|
||||||
@ -982,9 +983,9 @@ export default {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
{
|
{
|
||||||
success: '部署计划成功',
|
success: t('Deployment scheduled successfully'),
|
||||||
error: '部署计划失败',
|
error: t('Deployment scheduling failed'),
|
||||||
loading: '正在计划部署...'
|
loading: t('Scheduling deployment...')
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -993,7 +994,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '部署进行中',
|
label: t('Deployment in Progress'),
|
||||||
slots: {
|
slots: {
|
||||||
prefix: () => h(LoadingIndicator, { class: 'w-4 h-4' })
|
prefix: () => h(LoadingIndicator, { class: 'w-4 h-4' })
|
||||||
},
|
},
|
||||||
@ -1005,11 +1006,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '选项',
|
label: t('Options'),
|
||||||
condition: () => team.pg?.is_desk_user,
|
condition: () => team.pg?.is_desk_user,
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
label: '在 Desk 中查看',
|
label: t('View in Desk'),
|
||||||
icon: icon('external-link'),
|
icon: icon('external-link'),
|
||||||
condition: () => team.pg?.is_desk_user,
|
condition: () => team.pg?.is_desk_user,
|
||||||
onClick() {
|
onClick() {
|
||||||
|
|||||||
@ -43,6 +43,7 @@ Cancel Update,取消更新,
|
|||||||
Cancelled,取消,
|
Cancelled,取消,
|
||||||
Cancelling update...,正在取消更新...,
|
Cancelling update...,正在取消更新...,
|
||||||
Card,卡,
|
Card,卡,
|
||||||
|
China,中国大陆,
|
||||||
China Mainland,中国大陆,
|
China Mainland,中国大陆,
|
||||||
Category,类别,
|
Category,类别,
|
||||||
Change Plan,更改计划,
|
Change Plan,更改计划,
|
||||||
@ -491,6 +492,69 @@ Switch Team,切换团队,
|
|||||||
Logout,退出登录,
|
Logout,退出登录,
|
||||||
Suspended,已暂停,
|
Suspended,已暂停,
|
||||||
Broken,损坏,
|
Broken,损坏,
|
||||||
|
China,中国大陆,
|
||||||
|
Apps in this bench may have been patched,此工作台中的应用可能已打补丁,
|
||||||
|
Bench has been updated in place,工作台已就地更新,
|
||||||
|
Benches,工作台,
|
||||||
|
Processes,进程,
|
||||||
|
Uptime,运行时间,
|
||||||
|
times,次,
|
||||||
|
Fetch Latest Updates,获取最新更新,
|
||||||
|
Fetching latest updates for {app}...,正在为 {app} 获取最新更新...,
|
||||||
|
Latest updates fetched for {app},已为 {app} 获取最新更新,
|
||||||
|
Change Branch,更改分支,
|
||||||
|
Remove App,移除应用,
|
||||||
|
Visit Repository,访问仓库,
|
||||||
|
Add App,添加应用,
|
||||||
|
Replacing app...,替换应用中...,
|
||||||
|
Adding app...,添加应用中...,
|
||||||
|
App {app} updated,应用 {app} 已更新,
|
||||||
|
App {app} added,应用 {app} 已添加,
|
||||||
|
App removed,应用已移除,
|
||||||
|
Deploy,部署,
|
||||||
|
Deploy Candidate,部署候选,
|
||||||
|
Deploy Now,立即部署,
|
||||||
|
Deployment in Progress,部署进行中,
|
||||||
|
Deployment scheduled successfully,部署计划成功,
|
||||||
|
Deployment scheduling failed,部署计划失败,
|
||||||
|
Deploying...,正在部署...,
|
||||||
|
Changes deployed,更改已部署,
|
||||||
|
Deployment in progress. Please wait for it to complete.,部署正在进行中。请等待其完成。,
|
||||||
|
Deploy without app updates?,无需应用更新即可部署?,
|
||||||
|
No app updates detected. Deployment will apply dependency and environment variable changes.,未检测到应用更新。部署时将应用依赖项和环境变量的更改。,
|
||||||
|
Deployed at {date},部署于 {date},
|
||||||
|
Attention required!,需要关注!,
|
||||||
|
Deployer,部署者,
|
||||||
|
Config,配置,
|
||||||
|
Config Name,配置名称,
|
||||||
|
Config Value,配置值,
|
||||||
|
Add Config,添加配置,
|
||||||
|
Delete Config,删除配置,
|
||||||
|
Deleting config...,正在删除配置...,
|
||||||
|
Config {key} deleted,配置 {key} 已删除,
|
||||||
|
Custom Version,自定义版本,
|
||||||
|
Dependencies,依赖项,
|
||||||
|
Environment,环境,
|
||||||
|
Environment Variable Name,环境变量名称,
|
||||||
|
Environment Variable Value,环境变量值,
|
||||||
|
Add Environment Variable,添加环境变量,
|
||||||
|
Delete Environment Variable,删除环境变量,
|
||||||
|
Deleting environment variable...,正在删除环境变量...,
|
||||||
|
Environment variable {key} deleted,环境变量 {key} 已删除,
|
||||||
|
Impersonate Group Owner,模拟组所有者,
|
||||||
|
Name,名称,
|
||||||
|
Not Deployed,未部署,
|
||||||
|
Add Region,添加区域,
|
||||||
|
Repository,仓库,
|
||||||
|
Branch,分支,
|
||||||
|
Scheduling deployment...,正在计划部署...,
|
||||||
|
What is this?,这是什么?,
|
||||||
|
Action Required,需要操作,
|
||||||
|
<b>Builds suspended:</b> Updates will be scheduled after builds resume.,<b>构建已暂停:</b>更新将在构建恢复后计划运行。,
|
||||||
|
Are you sure you want to remove app <b>{app}</b>?,确定要移除应用 <b>{app}</b> 吗?,
|
||||||
|
Removing app...,正在移除应用...,
|
||||||
|
Are you sure you want to delete config <b>{key}</b>?,确定要删除配置 <b>{key}</b> 吗?,
|
||||||
|
Are you sure you want to delete environment variable <b>{key}</b>?,确定要删除环境变量 <b>{key}</b> 吗?,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
|
Can't render this file because it has a wrong number of fields in line 386.
|
Loading…
x
Reference in New Issue
Block a user