refactor(i18n): use JSON with flattened key and namespace (#30114)

Co-authored-by: yyh <yuanyouhuilyz@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Stephen Zhou
2025-12-29 14:52:32 +08:00
committed by GitHub
parent 09be869f58
commit 6d0e36479b
2552 changed files with 111159 additions and 142972 deletions

View File

@ -20,7 +20,14 @@ type DeprecationNoticeProps = {
textClassName?: string
}
const i18nPrefix = 'plugin.detailPanel.deprecation'
const i18nPrefix = 'detailPanel.deprecation'
type DeprecatedReasonKey = 'businessAdjustments' | 'ownershipTransferred' | 'noMaintainer'
const validReasonKeys: DeprecatedReasonKey[] = ['businessAdjustments', 'ownershipTransferred', 'noMaintainer']
function isValidReasonKey(key: string): key is DeprecatedReasonKey {
return (validReasonKeys as string[]).includes(key)
}
const DeprecationNotice: FC<DeprecationNoticeProps> = ({
status,
@ -37,19 +44,15 @@ const DeprecationNotice: FC<DeprecationNoticeProps> = ({
const deprecatedReasonKey = useMemo(() => {
if (!deprecatedReason)
return ''
return camelCase(deprecatedReason)
return null
const key = camelCase(deprecatedReason)
if (isValidReasonKey(key))
return key
return null
}, [deprecatedReason])
// Check if the deprecatedReasonKey exists in i18n
const hasValidDeprecatedReason = useMemo(() => {
if (!deprecatedReason || !deprecatedReasonKey)
return false
// Define valid reason keys that exist in i18n
const validReasonKeys = ['businessAdjustments', 'ownershipTransferred', 'noMaintainer']
return validReasonKeys.includes(deprecatedReasonKey)
}, [deprecatedReason, deprecatedReasonKey])
const hasValidDeprecatedReason = deprecatedReasonKey !== null
if (status !== 'deleted')
return null
@ -82,7 +85,7 @@ const DeprecationNotice: FC<DeprecationNoticeProps> = ({
),
}}
values={{
deprecatedReason: t(`${i18nPrefix}.reason.${deprecatedReasonKey}` as any) as string,
deprecatedReason: deprecatedReasonKey ? t(`${i18nPrefix}.reason.${deprecatedReasonKey}`, { ns: 'plugin' }) : '',
alternativePluginId,
}}
/>
@ -91,13 +94,13 @@ const DeprecationNotice: FC<DeprecationNoticeProps> = ({
{
hasValidDeprecatedReason && !alternativePluginId && (
<span>
{t(`${i18nPrefix}.onlyReason` as any, { deprecatedReason: t(`${i18nPrefix}.reason.${deprecatedReasonKey}` as any) as string }) as string}
{t(`${i18nPrefix}.onlyReason`, { ns: 'plugin', deprecatedReason: deprecatedReasonKey ? t(`${i18nPrefix}.reason.${deprecatedReasonKey}`, { ns: 'plugin' }) : '' })}
</span>
)
}
{
!hasValidDeprecatedReason && (
<span>{t(`${i18nPrefix}.noReason`)}</span>
<span>{t(`${i18nPrefix}.noReason`, { ns: 'plugin' })}</span>
)
}
</div>

View File

@ -54,7 +54,7 @@ const KeyValueItem: FC<Props> = ({
<span className={cn(valueMaxWidthClassName, ' system-xs-medium truncate text-text-secondary')}>
{maskedValue || value}
</span>
<Tooltip popupContent={t(`common.operation.${isCopied ? 'copied' : 'copy'}`)} position="top">
<Tooltip popupContent={t(`operation.${isCopied ? 'copied' : 'copy'}`, { ns: 'common' })} position="top">
<ActionButton onClick={handleCopy}>
<CopyIcon className="h-3.5 w-3.5 shrink-0 text-text-tertiary" />
</ActionButton>