Benches菜单增加多语言支持

This commit is contained in:
jingrow 2025-12-29 04:42:45 +08:00
parent bdb0e583aa
commit fc4152cf19
4 changed files with 197 additions and 131 deletions

View File

@ -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:

View File

@ -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[];

View File

@ -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() {

View File

@ -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.