feat(admin-web): localize template wizard for en-US articles
Deployment Config CI / Deployment Config (push) Successful in 47s
Frontend CI / Frontend (push) Successful in 3m14s
Backend CI / Backend (push) Successful in 16m45s

Drive the wizard off the article locale instead of the UI locale so an
en-US article stays in English end to end, and stop Chinese values from
leaking into English drafts.

- Localize review-intro-hook copy and outline section labels to English
  (with fallbacks), and use a ": " separator for en-US
- Sanitize CJK content from titles, outline, and key points when the
  article locale is en-US, and re-sanitize on locale switch/draft restore
- Add knowledge-base reference labels/placeholders and the
  missing-review-intro-hook validation message to both locales

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-09 19:39:29 +08:00
parent 2c394d436a
commit 0acd37918e
3 changed files with 286 additions and 22 deletions
@@ -981,6 +981,7 @@ const enUS = {
generatedOutline: 'Confirm outline',
outlinePreview: 'Outline preview',
keyPoints: 'Key points',
knowledgeGroups: 'Knowledge base references',
review: 'Review',
notes: 'Notes',
inputParams: 'Input params',
@@ -1063,6 +1064,7 @@ const enUS = {
customTitle: 'Override the AI title here if needed',
customOutline: 'Add another section, for example “Buying advice”',
keyPoints: 'Add any extra instructions, key angles, or constraints for the article',
knowledgeGroups: 'Optional, used to enrich the article context and factual background',
competitorWebsite: 'Official site or landing page',
competitorName: 'Competitor name',
competitorDescription: 'One-line positioning or summary',
@@ -1111,6 +1113,7 @@ const enUS = {
selectBrandBeforeQuestion: 'Select the current company in the top bar before continuing.',
missingPrimaryQuestion: 'Choose one primary brand question.',
missingTitle: 'Please choose or enter an article title.',
missingReviewIntroHook: 'Choose one review intro hook first.',
missingOutline: 'Please select at least one outline section.',
missingGeneratedOutline: 'Please generate and confirm the article outline first.',
customOutlineTooLong: 'Custom sections cannot exceed {count} characters.',
@@ -954,6 +954,7 @@ const zhCN = {
generatedOutline: '确认文章大纲',
outlinePreview: '大纲预览',
keyPoints: '文章关键要点',
knowledgeGroups: '引用知识库',
review: '提交前确认',
notes: '生成说明',
inputParams: '输入参数',
@@ -1028,6 +1029,7 @@ const zhCN = {
customTitle: '如需覆盖 AI 标题,可在这里直接输入',
customOutline: '补充一个额外结构,例如“选购建议”',
keyPoints: '告诉 AI 还需要强调哪些要点、风格或限制条件',
knowledgeGroups: '可选,用于补充文章内容和事实背景',
competitorWebsite: '官网或落地页地址',
competitorName: '竞品名称',
competitorDescription: '一句话说明竞品定位或特点',