2 Commits
Author SHA1 Message Date
cedric 85e9142a32 feat: add pt-BR/ja/ko to translation submission form
Déploiement FRONT BETA / check (push) Successful in 2m4s
Déploiement FRONT PROD / check (push) Successful in 2m13s
Déploiement FRONT PROD / deploy (push) Successful in 24s
Déploiement FRONT BETA / deploy (push) Successful in 24s
2026-07-03 13:48:55 +04:00
cedric 054a45246e feat: show translations as tabs instead of grid 2026-07-03 13:48:47 +04:00
3 changed files with 120 additions and 80 deletions
+22 -1
View File
@@ -76,7 +76,7 @@ function AjouteTradiksyon({showSwitch, disableSwitch, tradiksyonOtomatik, setTra
aria-haspopup='true' aria-haspopup='true'
onClick={handleClick} onClick={handleClick}
> >
Ajouter une traduction <br /> 🇺🇸 🇫🇷 🇪🇸 🇩🇪 🇮🇹 Ajouter une traduction <br /> 🇺🇸 🇫🇷 🇪🇸 🇩🇪 🇮🇹 🇧🇷 🇯🇵 🇰🇷
</Button> </Button>
<StyledMenu <StyledMenu
keepMounted keepMounted
@@ -123,6 +123,27 @@ function AjouteTradiksyon({showSwitch, disableSwitch, tradiksyonOtomatik, setTra
}} }}
onClick={handleClose} onClick={handleClose}
>🇮🇹 Italien</StyledMenuItem> >🇮🇹 Italien</StyledMenuItem>
<StyledMenuItem
id='pt'
classes={{
root: classes.root
}}
onClick={handleClose}
>🇧🇷 Portugais</StyledMenuItem>
<StyledMenuItem
id='ja'
classes={{
root: classes.root
}}
onClick={handleClose}
>🇯🇵 Japonais</StyledMenuItem>
<StyledMenuItem
id='ko'
classes={{
root: classes.root
}}
onClick={handleClose}
>🇰🇷 Coréen</StyledMenuItem>
</StyledMenu> </StyledMenu>
</Root> </Root>
</> </>
+43 -7
View File
@@ -65,6 +65,21 @@ const textLabels = {
title: 'Traduzione', title: 'Traduzione',
help: 'Traduzione del testo', help: 'Traduzione del testo',
emoji: '&#127470;&#127481;' emoji: '&#127470;&#127481;'
},
pt: {
title: 'Tradução',
help: 'Tradução da letra',
emoji: '&#127463;&#127479;'
},
ja: {
title: '翻訳',
help: '歌詞の翻訳',
emoji: '&#127471;&#127477;'
},
ko: {
title: '번역',
help: '가사 번역',
emoji: '&#127472;&#127479;'
} }
} }
@@ -78,7 +93,7 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
const {data: session} = useSession() const {data: session} = useSession()
const {jwt, user} = session const {jwt, user} = session
const [teksEkri, setTeksEkri] = useState({awtis: '', tit: '', transkripsyon: ''}) const [teksEkri, setTeksEkri] = useState({awtis: '', tit: '', transkripsyon: ''})
const [tradiksyon, setTradiksyon] = useState({fr: '', en: '', es: '', de: '', it: ''}) const [tradiksyon, setTradiksyon] = useState({fr: '', en: '', es: '', de: '', it: '', pt: '', ja: '', ko: ''})
const [kiChawLang, setKiChwalang] = useState(['fr']) const [kiChawLang, setKiChwalang] = useState(['fr'])
const [error, setError] = useState('') const [error, setError] = useState('')
const [success, setSuccess] = useState('') const [success, setSuccess] = useState('')
@@ -112,7 +127,7 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
const handleClick = async () => { const handleClick = async () => {
setLoading(true) setLoading(true)
const {awtis, tit, transkripsyon} = teksEkri const {awtis, tit, transkripsyon} = teksEkri
const {fr, en, es, de, it} = tradiksyon const {fr, en, es, de, it, pt, ja, ko} = tradiksyon
if (teksEkri.awtis === '' || teksEkri.tit === '' || teksEkri.transkripsyon === '') { if (teksEkri.awtis === '' || teksEkri.tit === '' || teksEkri.transkripsyon === '') {
setError({message: 'Certains champs sont obligatoires'}) setError({message: 'Certains champs sont obligatoires'})
@@ -139,7 +154,10 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
anglais: en === '' ? null : en, anglais: en === '' ? null : en,
espagnol: es === '' ? null : es, espagnol: es === '' ? null : es,
allemand: de === '' ? null : de, allemand: de === '' ? null : de,
italien: it === '' ? null : it italien: it === '' ? null : it,
portugais: pt === '' ? null : pt,
japonais: ja === '' ? null : ja,
coreen: ko === '' ? null : ko
}, },
user: { user: {
id: user.id, id: user.id,
@@ -184,7 +202,10 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
anglais: en === '' ? null : en, anglais: en === '' ? null : en,
espagnol: es === '' ? null : es, espagnol: es === '' ? null : es,
allemand: de === '' ? null : de, allemand: de === '' ? null : de,
italien: it === '' ? null : it italien: it === '' ? null : it,
portugais: pt === '' ? null : pt,
japonais: ja === '' ? null : ja,
coreen: ko === '' ? null : ko
}, },
user: { user: {
id: user.id, id: user.id,
@@ -211,7 +232,7 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
const handleReset = () => { const handleReset = () => {
setTeksEkri({awtis: '', tit: '', transkripsyon: ''}) setTeksEkri({awtis: '', tit: '', transkripsyon: ''})
setTradiksyon({fr: '', en: '', es: '', de: '', it: ''}) setTradiksyon({fr: '', en: '', es: '', de: '', it: '', pt: '', ja: '', ko: ''})
setKiChwalang(['fr']) setKiChwalang(['fr'])
setCurrentTeksId(null) setCurrentTeksId(null)
setTradiksyonOtomatik(false) setTradiksyonOtomatik(false)
@@ -244,7 +265,10 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
en: selectedTeks?.traductions?.anglais || '', en: selectedTeks?.traductions?.anglais || '',
es: selectedTeks?.traductions?.espagnol || '', es: selectedTeks?.traductions?.espagnol || '',
de: selectedTeks?.traductions?.allemand || '', de: selectedTeks?.traductions?.allemand || '',
it: selectedTeks?.traductions?.italien || '' it: selectedTeks?.traductions?.italien || '',
pt: selectedTeks?.traductions?.portugais || '',
ja: selectedTeks?.traductions?.japonais || '',
ko: selectedTeks?.traductions?.coreen || ''
}) })
const jennLangId = () => { const jennLangId = () => {
@@ -270,6 +294,18 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
ids.push('it') ids.push('it')
} }
if (selectedTeks?.traductions?.portugais) {
ids.push('pt')
}
if (selectedTeks?.traductions?.japonais) {
ids.push('ja')
}
if (selectedTeks?.traductions?.coreen) {
ids.push('ko')
}
return ids return ids
} }
@@ -373,7 +409,7 @@ function EkriTeks({canAutoTranslate, selectedTeks, setSelectedTeks}) {
</form> </form>
<AjouteTradiksyon <AjouteTradiksyon
showSwitch={Boolean(canAutoTranslate) && Boolean(!currentTeksId)} showSwitch={Boolean(canAutoTranslate) && Boolean(!currentTeksId)}
disableSwitch={tradiksyon.fr === '' || tradiksyon.en !== '' || tradiksyon.es !== '' || tradiksyon.de !== '' || tradiksyon.it !== ''} disableSwitch={tradiksyon.fr === '' || tradiksyon.en !== '' || tradiksyon.es !== '' || tradiksyon.de !== '' || tradiksyon.it !== '' || tradiksyon.pt !== '' || tradiksyon.ja !== '' || tradiksyon.ko !== ''}
tradiksyonOtomatik={tradiksyonOtomatik} tradiksyonOtomatik={tradiksyonOtomatik}
setTradiksyonOtomatik={setTradiksyonOtomatik} setTradiksyonOtomatik={setTradiksyonOtomatik}
chwaLang={kiChawLang} chwaLang={kiChawLang}
+49 -66
View File
@@ -1,9 +1,10 @@
'use client' 'use client'
import {useEffect} from 'react' import {useEffect, useState} from 'react'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import Box from '@mui/material/Box' import Box from '@mui/material/Box'
import Grid from '@mui/material/Grid' import Tabs from '@mui/material/Tabs'
import Tab from '@mui/material/Tab'
import Typography from '@mui/material/Typography' import Typography from '@mui/material/Typography'
import Tooltip from '@mui/material/Tooltip' import Tooltip from '@mui/material/Tooltip'
import {useMediaQuery} from '@mui/material' import {useMediaQuery} from '@mui/material'
@@ -78,54 +79,30 @@ const Root = styled('div')((
}, },
})) }))
const LANG_NAMES = {fr: 'Français', en: 'English', es: 'Español', de: 'Deutsch', it: 'Italiano'} const LANG_NAMES = {
fr: 'Français', en: 'English', es: 'Español', de: 'Deutsch', it: 'Italiano',
const langToArray = parole => { pt: 'Português', ja: '日本語', ko: '한국어',
const langArray = []
if (parole && parole.traductions) {
const {francais, anglais, espagnol, allemand, italien} = parole.traductions
if (anglais) {
langArray.push({title: 'English', lang: anglais})
}
if (francais) {
langArray.push({title: 'Français', lang: francais})
}
if (espagnol) {
langArray.push({title: 'Español', lang: espagnol})
}
if (allemand) {
langArray.push({title: 'Deutsch', lang: allemand})
}
if (italien) {
langArray.push({title: 'Italiano', lang: italien})
}
}
return langArray
} }
const alignTeks = (langArray, isMobile) => { const TRAD_FIELDS = [
if (langArray.length > 0 && !isMobile) { {field: 'anglais', title: 'English'},
return 'justify' {field: 'francais', title: 'Français'},
{field: 'espagnol', title: 'Español'},
{field: 'allemand', title: 'Deutsch'},
{field: 'italien', title: 'Italiano'},
{field: 'portugais', title: 'Português'},
{field: 'japonais', title: '日本語'},
{field: 'coreen', title: '한국어'},
]
const langToArray = parole => {
if (!parole || !parole.traductions) {
return []
} }
if (langArray.length > 0 && isMobile) { return TRAD_FIELDS
return 'justify' .filter(({field}) => parole.traductions[field])
} .map(({field, title}) => ({title, lang: parole.traductions[field]}))
if (langArray.length === 0 && isMobile) {
return 'justify'
}
if (langArray.length === 0 && !isMobile) {
return 'center'
}
} }
const ExplicitTooltip = Tooltip const ExplicitTooltip = Tooltip
@@ -135,6 +112,7 @@ export default function Teks({parole}) {
const langArray = langToArray(parole) const langArray = langToArray(parole)
const enhancedAliases = getAlias(parole.artistes, parole.prioriteArtistes, true) const enhancedAliases = getAlias(parole.artistes, parole.prioriteArtistes, true)
const coverFmt = formatKuveti(parole.couverture) const coverFmt = formatKuveti(parole.couverture)
const [tab, setTab] = useState(0)
useEffect(() => { useEffect(() => {
const isBrowser = () => typeof window !== 'undefined' const isBrowser = () => typeof window !== 'undefined'
@@ -231,35 +209,40 @@ export default function Teks({parole}) {
</Box> </Box>
)} )}
</Box> </Box>
<Grid container justifycontent='center' spacing={1}> <Box sx={{maxWidth: 700, margin: '0 auto'}} className={classes.gridText}>
<Grid size={{xs: 12, md: langArray.length > 0 ? 6 : null}}> <Tabs
<Box className={classes.gridText}> value={tab}
<Typography align='center' sx={{marginBottom: '0.5em'}} variant='h4'> onChange={(event, value) => setTab(value)}
Transcription variant='scrollable'
scrollButtons='auto'
centered={langArray.length === 0}
sx={{borderBottom: 1, borderColor: 'divider', mb: 2}}
>
<Tab label='Transcription' />
{langArray.map(({title}) => (
<Tab key={title} label={title} />
))}
</Tabs>
{tab === 0 && (
<>
{parole.langueSource && parole.langueSource !== 'ka' && ( {parole.langueSource && parole.langueSource !== 'ka' && (
<Typography component='span' variant='body2' color='text.secondary' sx={{ml: 1}}> <Typography align='center' variant='body2' color='text.secondary' sx={{mb: 1}}>
({LANG_NAMES[parole.langueSource]}) ({LANG_NAMES[parole.langueSource]})
</Typography> </Typography>
)} )}
</Typography> <Typography paragraph='true' align={isMobile ? 'justify' : 'center'} component='span'>
<Typography paragraph='true' align={alignTeks(langArray, isMobile)} component='span'>
{formatJsonString(parole.transcription)} {formatJsonString(parole.transcription)}
</Typography> </Typography>
</Box> </>
</Grid> )}
{langArray.map(({title, lang}) => ( {langArray.map(({title, lang}, index) => (
<Grid key={title} size={{xs: 12, md: 6}}> tab === index + 1 && (
<Box className={classes.gridText}> <Typography key={title} paragraph='true' align='justify' component='span'>
<Typography align='center' sx={{marginBottom: '0.5em'}} variant='h4'>
{title}
</Typography>
<Typography paragraph='true' align='justify' component='span'>
{formatJsonString(lang)} {formatJsonString(lang)}
</Typography> </Typography>
</Box> )
</Grid>
))} ))}
</Grid> </Box>
</Root> </Root>
) )
} }