{t('Construction du corps')}
renameActiveAvatar(event.currentTarget.value)} onFocus={event => { if (focusAvatarName) event.currentTarget.select() }} onBlur={event => { if (!event.currentTarget.value.trim()) renameActiveAvatar('Unknown') setFocusAvatarName(false) }} />{t('Choisis la forme principale puis assemble les primitives autour d’elle.')}
{activeAvatar.name}
{t( mode === 'manual' ? 'Pose' : mode === 'avatars' ? 'Avatars' : mode === 'expressions' ? 'Expressions' : mode === 'states' ? 'Animations' : 'Exporter' )}
{t('Position locale')}
{(['X', 'Y', 'Z'] as const).map((axis, index) => ({t('Rotation locale')}
{(['X', 'Y', 'Z'] as const).map((axis, index) => ({t( 'Définis l’identité du regard de cet avatar. Les poses s’ajoutent ensuite à cette base.' )}
{(['width', 'height', 'size'] as const).map(dimension => ({t( { width: 'Largeur', height: 'Hauteur', size: 'Taille proportionnelle', }[dimension] )}
{t('Position et espacement')}
{t('Coordonnées propres à l’avatar, indépendantes des poses.')}
{t(side === 'Left' ? 'Œil gauche' : 'Œil droit')}
{t( { width: 'Largeur', height: 'Hauteur', size: 'Taille proportionnelle', }[dimension] )}
{t('Œil gauche')}
{t('Œil droit')}
{expressions.length} presets
{sequences.length} {t('animations')}
-
{runtimeExportErrors.map((error, index) => (
- {error} ))}
{highlightedCode(runtimeInstallExample)}
{highlightedCode(runtimeReactExample)}
{t( runtimeCopyStatus === 'success' ? 'JSON runtime copié dans le presse-papiers.' : 'Impossible de copier le JSON runtime.' )}
)}{selectedExportAnimations.length}/{sequences.length} {t('sélectionnées')}
{t('Animations à exporter')}
{projectImportError}
)}{t('Détails de l’animation')}
{activeSequenceLabel}
{activeSequence.builtIn ? t(activeSequence.description) : activeSequence.description}