Skip to content

Commit d8f7c43

Browse files
committed
refactor(metadata-admin): i18n read-only type banner with dark mode
1 parent b30321d commit d8f7c43

2 files changed

Lines changed: 16 additions & 7 deletions

File tree

packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -578,11 +578,20 @@ export function MetadataResourceEditPage({
578578
</div>
579579
)}
580580
{readOnly && (
581-
<div className="text-xs text-amber-800 border border-amber-300 bg-amber-50 rounded p-3">
582-
This type is read-only. To enable runtime editing, set{' '}
583-
<code className="font-mono">OBJECTSTACK_METADATA_WRITABLE</code> to
584-
include <code className="font-mono">{type}</code>, or flip{' '}
585-
<code className="font-mono">allowOrgOverride</code> in the registry.
581+
<div className="text-xs text-amber-800 border border-amber-300 bg-amber-50 rounded p-3 dark:text-amber-200 dark:border-amber-700/50 dark:bg-amber-950/30">
582+
{/* The platform i18n bundle ships `engine.edit.readOnlyTypeBanner`
583+
with `{flag} / {type} / {override}` placeholders so the
584+
monospace tokens are inlined inside the translated sentence
585+
in any locale. Splitting on the three tokens preserves the
586+
sentence order across translations. */}
587+
{t('engine.edit.readOnlyTypeBanner', locale)
588+
.split(/(\{flag\}|\{type\}|\{override\})/)
589+
.map((part, i) => {
590+
if (part === '{flag}') return <code key={i} className="font-mono">OBJECTSTACK_METADATA_WRITABLE</code>;
591+
if (part === '{type}') return <code key={i} className="font-mono">{type}</code>;
592+
if (part === '{override}') return <code key={i} className="font-mono">allowOrgOverride</code>;
593+
return <React.Fragment key={i}>{part}</React.Fragment>;
594+
})}
586595
</div>
587596
)}
588597
</div>

packages/app-shell/src/views/metadata-admin/i18n.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ const ENGINE_STRINGS_EN: Record<string, string> = {
170170
'engine.edit.overlay': 'overlay',
171171
'engine.edit.readOnlyBanner': 'Viewing in read-only mode. Click {edit} to make changes.',
172172
'engine.edit.readOnlyTypeBanner':
173-
'This type is read-only. To enable runtime editing, set {flag} to include {type}, or flip {override} in the registry.',
173+
'This metadata type is read-only for safety: it ships executable code or sensitive configuration and cannot be overlaid at runtime. Edit the source in your package and redeploy. To override this lock (use with caution), set {flag} to include {type}, or flip {override} in the registry.',
174174
'engine.repeater.empty': 'No items. Click + to add.',
175175
'engine.badge.writable': 'writable',
176176
'engine.badge.readOnly': 'read-only',
@@ -284,7 +284,7 @@ const ENGINE_STRINGS_ZH: Record<string, string> = {
284284
'engine.edit.overlay': '覆盖',
285285
'engine.edit.readOnlyBanner': '当前为只读模式。点击 {edit} 进行修改。',
286286
'engine.edit.readOnlyTypeBanner':
287-
'此类型为只读。如需启用运行时编辑,请将 {flag} 设置为包含 {type},或在注册表中开启 {override}。',
287+
'出于安全考虑,此元数据类型为只读:它包含可执行代码或敏感配置,不允许在运行时通过覆盖层修改。请编辑包内源代码后重新部署。如需临时解除限制(请谨慎使用),可将 {flag} 设置为包含 {type},或在注册表中开启 {override}。',
288288
'engine.repeater.empty': '暂无条目。点击 + 添加。',
289289
'engine.badge.writable': '可写',
290290
'engine.badge.readOnly': '只读',

0 commit comments

Comments
 (0)