319ccc32ee
Build and Deploy Verso / deploy (push) Successful in 18m46s
- Rewrites LanguagePicker to use availableLanguages from ol-footer meta
instead of subdomainLang (which is always empty in single-domain setup)
- Passes availableLanguages through layout-react.pug → ol-footer meta so
React footer picks it up
- Adds InterfaceLanguageSetting component to the editor settings modal
("Spelling and language" tab) for use when no footer is present
- Adds interface_language key to all five locale files (en/fr/de/es/it)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
121 lines
2.9 KiB
TypeScript
121 lines
2.9 KiB
TypeScript
import type {
|
|
FooterItem,
|
|
FooterMetadata,
|
|
} from '@/shared/components/types/footer-metadata'
|
|
import OLRow from '@/shared/components/ol/ol-row'
|
|
import LanguagePicker from '@/shared/components/language-picker'
|
|
import React from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
function FooterItemLi({
|
|
text,
|
|
translatedText,
|
|
url: href,
|
|
class: className,
|
|
label,
|
|
}: FooterItem) {
|
|
const textToDisplay = translatedText || text
|
|
|
|
if (!href) {
|
|
return <li dangerouslySetInnerHTML={{ __html: textToDisplay }} />
|
|
}
|
|
|
|
const linkProps = {
|
|
href,
|
|
className,
|
|
'aria-label': label,
|
|
}
|
|
|
|
return (
|
|
<li>
|
|
<a {...linkProps}>{textToDisplay}</a>
|
|
</li>
|
|
)
|
|
}
|
|
|
|
function Separator() {
|
|
return (
|
|
<li role="separator" className="text-muted">
|
|
<strong>|</strong>
|
|
</li>
|
|
)
|
|
}
|
|
|
|
function ThinFooter({
|
|
availableLanguages,
|
|
leftItems,
|
|
rightItems,
|
|
}: FooterMetadata) {
|
|
const { t } = useTranslation()
|
|
const showLanguagePicker = (availableLanguages?.length ?? 0) > 1
|
|
|
|
return (
|
|
<footer className="site-footer">
|
|
<div className="site-footer-content d-print-none">
|
|
<OLRow>
|
|
<ul className="site-footer-items col-lg-9">
|
|
<li>
|
|
© {new Date().getFullYear()}{' '}
|
|
<a
|
|
href="https://alocoq.fr"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Aloïs Coquillard
|
|
</a>
|
|
</li>
|
|
<Separator />
|
|
<li>
|
|
{t('built_on')}{' '}
|
|
<a
|
|
href="https://github.com/overleaf/overleaf"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Overleaf
|
|
</a>
|
|
</li>
|
|
{showLanguagePicker ? (
|
|
<>
|
|
<Separator />
|
|
<li>
|
|
<LanguagePicker showHeader />
|
|
</li>
|
|
</>
|
|
) : null}
|
|
{leftItems?.map(item => (
|
|
<FooterItemLi key={item.text} {...item} />
|
|
))}
|
|
</ul>
|
|
<ul className="site-footer-items col-lg-3 text-end">
|
|
<li>
|
|
<a
|
|
href="https://git.alocoq.fr/alois/verso/src/branch/main/LICENSE"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
{t('agpl_licence')}
|
|
</a>
|
|
</li>
|
|
<Separator />
|
|
<li>
|
|
<a
|
|
href="https://git.alocoq.fr/alois/verso"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
{t('source_code')}
|
|
</a>
|
|
</li>
|
|
{rightItems?.map(item => (
|
|
<FooterItemLi key={item.text} {...item} />
|
|
))}
|
|
</ul>
|
|
</OLRow>
|
|
</div>
|
|
</footer>
|
|
)
|
|
}
|
|
|
|
export default ThinFooter
|