fix: 修复新 UI 语言与文案显示问题 (#4876)

* chore(dev): add local setup state reset target

- add a reset-setup make target to clear setup records, root users, and related options.
- support both docker dev PostgreSQL and local SQLite development databases.
- restart the docker dev backend so setup status is recalculated after reset.

* fix(chat): prevent preset menu text overflow

- add truncation layout for chat preset names to keep long labels inside the sidebar menu.
- prevent loading and external-link icons from shrinking in constrained menu rows.

* fix(i18n): translate dashboard granularity options

- call t() for granularity option labels in dashboard system settings.
- keep localized text consistent between the select trigger and dropdown items.

* chore(dev): add backend dev service rebuild target

- add a dev-api-rebuild make target to rebuild and start the docker backend service.
- reuse DEV_COMPOSE_FILE and DEV_BACKEND_SERVICE variables to avoid repeated compose config literals.

* fix(i18n): align interface language option labels

- add shared interface language options to keep display names consistent.
- reuse the shared options in the header switcher and profile preferences.
- normalize language codes so zh-CN and zh_CN resolve to Simplified Chinese.

* fix(i18n): add missing frontend translation keys

- route channel key prompts, form validation messages, and channel fallback text through i18n.
- add missing translations across six locales for channels, rankings, billing, and logs.
- update i18n sync reports so literal t() keys are present in the base locale.
This commit is contained in:
QuentinHsu
2026-05-17 11:45:27 +08:00
committed by GitHub
parent 68830e6097
commit f69ceb6967
22 changed files with 527 additions and 257 deletions
@@ -232,13 +232,20 @@ export function ChannelTestDialog({
} catch (error: unknown) {
updateTestResult(model, {
status: 'error',
error: error instanceof Error ? error.message : 'Test failed',
error: error instanceof Error ? error.message : t('Test failed'),
})
} finally {
markModelTesting(model, false)
}
},
[currentRow, endpointType, isStreamTest, markModelTesting, updateTestResult]
[
currentRow,
endpointType,
isStreamTest,
markModelTesting,
t,
updateTestResult,
]
)
const handleBatchTest = useCallback(
@@ -138,7 +138,7 @@ export function MultiKeyManageDialog({
}
} catch (error: unknown) {
toast.error(
error instanceof Error ? error.message : 'Failed to load key status'
error instanceof Error ? error.message : t('Failed to load key status')
)
} finally {
setIsLoading(false)
@@ -181,7 +181,7 @@ export function MultiKeyManageDialog({
}
if (response?.success) {
toast.success(response.message || 'Operation successful')
toast.success(response.message || t('Operation successful'))
queryClient.invalidateQueries({ queryKey: channelsQueryKeys.lists() })
// Reload data - reset to page 1 for bulk actions
@@ -193,10 +193,12 @@ export function MultiKeyManageDialog({
loadKeyStatus(currentPage, pageSize)
}
} else {
toast.error(response?.message || 'Operation failed')
toast.error(response?.message || t('Operation failed'))
}
} catch (error: unknown) {
toast.error(error instanceof Error ? error.message : 'Operation failed')
toast.error(
error instanceof Error ? error.message : t('Operation failed')
)
} finally {
setIsPerformingAction(false)
setConfirmAction(null)
@@ -697,7 +697,7 @@ export function ChannelMutateDrawer({
try {
const res = await getChannelKey(channelId)
if (!res.success) {
throw new Error(res.message || 'Failed to fetch channel key')
throw new Error(res.message || t('Failed to fetch channel key'))
}
const keyValue = res.data?.key ?? ''
@@ -732,7 +732,7 @@ export function ChannelMutateDrawer({
try {
const res = await refreshCodexCredential(channelId)
if (!res.success) {
throw new Error(res.message || 'Failed to refresh credential')
throw new Error(res.message || t('Failed to refresh credential'))
}
toast.success(t('Credential refreshed'))
queryClient.invalidateQueries({