fixes up remaining translation strings

This commit is contained in:
Jarrod Flesch
2024-01-16 12:15:09 -05:00
parent 13313028b5
commit b781e5cc88
28 changed files with 259 additions and 239 deletions

View File

@@ -56,7 +56,7 @@ export const DefaultAccount: React.FC<DefaultAccountViewProps> = (props) => {
return ( return (
<React.Fragment> <React.Fragment>
{/* <Meta description={t('accountOfCurrentUser')} keywords={t('account')} title={t('account')} /> */} {/* <Meta description={i18n.t('authentication:accountOfCurrentUser')} keywords={t('authentication:account')} title={t('authentication:account')} /> */}
{/* <LoadingOverlayToggle name="account" show={isLoading} type="withoutNav" /> */} {/* <LoadingOverlayToggle name="account" show={isLoading} type="withoutNav" /> */}
<OperationProvider operation="update"> <OperationProvider operation="update">
<Form <Form

View File

@@ -29,8 +29,8 @@ export const generateMetadata = async ({
}) })
return meta({ return meta({
title: t('createFirstUser'), title: t('authentication:createFirstUser'),
description: t('createFirstUser'), description: t('authentication:createFirstUser'),
keywords: t('general:create'), keywords: t('general:create'),
config, config,
}) })
@@ -69,22 +69,19 @@ export const CreateFirstUser: React.FC<{
const fields = [ const fields = [
{ {
name: 'email', name: 'email',
label: 'Email Address', label: t('general:emailAddress'),
// label: t('general:emailAddress'),
required: true, required: true,
type: 'email', type: 'email',
}, },
{ {
name: 'password', name: 'password',
label: 'Password', label: t('general:password'),
// label: t('general:password'),
required: true, required: true,
type: 'password', type: 'password',
}, },
{ {
name: 'confirm-password', name: 'confirm-password',
label: 'Confirm Password', label: t('authentication:confirmPassword'),
// label: t('confirmPassword'),
required: true, required: true,
type: 'confirmPassword', type: 'confirmPassword',
}, },
@@ -103,7 +100,7 @@ export const CreateFirstUser: React.FC<{
return ( return (
<MinimalTemplate className={baseClass}> <MinimalTemplate className={baseClass}>
<h1>{t('general:welcome')}</h1> <h1>{t('general:welcome')}</h1>
<p>{t('beginCreateFirstUser')}</p> <p>{t('authentication:beginCreateFirstUser')}</p>
<Form <Form
action={`${serverURL}${api}/${userSlug}/first-register`} action={`${serverURL}${api}/${userSlug}/first-register`}
method="POST" method="POST"

View File

@@ -15,7 +15,7 @@ import {
import type { EditViewProps } from '@payloadcms/ui' import type { EditViewProps } from '@payloadcms/ui'
import queryString from 'qs' import queryString from 'qs'
import { notFound } from 'next/navigation' import { notFound } from 'next/navigation'
import { TFunction } from 'i18next' import { TFunction } from '@payloadcms/translations'
import { AdminViewComponent } from 'payload/config' import { AdminViewComponent } from 'payload/config'
import { getViewsFromConfig } from './getViewsFromConfig' import { getViewsFromConfig } from './getViewsFromConfig'
import type { DocumentPermissions } from 'payload/types' import type { DocumentPermissions } from 'payload/types'

View File

@@ -5,8 +5,8 @@ import { SanitizedConfig } from 'payload/types'
import Link from 'next/link' import Link from 'next/link'
import { initPage } from '../../utilities/initPage' import { initPage } from '../../utilities/initPage'
import { meta } from '../../utilities/meta' import { meta } from '../../utilities/meta'
import i18n from 'i18next'
import { Metadata } from 'next' import { Metadata } from 'next'
import { getNextT } from '../../utilities/getNextT'
const baseClass = 'forgot-password' const baseClass = 'forgot-password'
@@ -14,13 +14,18 @@ export const generateMetadata = async ({
config, config,
}: { }: {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
}): Promise<Metadata> => }): Promise<Metadata> => {
meta({ const t = getNextT({
title: i18n.t('forgotPassword'), config: await config,
description: i18n.t('forgotPassword'), })
keywords: i18n.t('forgotPassword'),
return meta({
title: t('authentication:forgotPassword'),
description: t('authentication:forgotPassword'),
keywords: t('authentication:forgotPassword'),
config, config,
}) })
}
export const ForgotPassword: React.FC<{ export const ForgotPassword: React.FC<{
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
@@ -39,7 +44,7 @@ export const ForgotPassword: React.FC<{
// setHasSubmitted(true) // setHasSubmitted(true)
// }, // },
// () => { // () => {
// toast.error(t('emailNotValid')) // toast.error(i18n.t('authentication:emailNotValid'))
// }, // },
// ) // )
// } // }
@@ -68,8 +73,8 @@ export const ForgotPassword: React.FC<{
// if (hasSubmitted) { // if (hasSubmitted) {
// return ( // return (
// <MinimalTemplate className={baseClass}> // <MinimalTemplate className={baseClass}>
// <h1>{t('emailSent')}</h1> // <h1>{i18n.t('authentication:emailSent')}</h1>
// <p>{t('checkYourEmailForPasswordReset')}</p> // <p>{i18n.t('authentication:checkYourEmailForPasswordReset')}</p>
// </MinimalTemplate> // </MinimalTemplate>
// ) // )
// } // }
@@ -81,30 +86,17 @@ export const ForgotPassword: React.FC<{
// handleResponse={handleResponse} // handleResponse={handleResponse}
method="POST" method="POST"
> >
<h1> <h1>{i18n.t('authentication:forgotPassword')}</h1>
Forgot Password <p>{i18n.t('authentication:forgotPasswordEmailInstructions')}</p>
{/* {t('forgotPassword')} */}
</h1>
<p>
Enter your email address and we will send you a link to reset your password.
{/* {t('forgotPasswordEmailInstructions')} */}
</p>
<Email <Email
admin={{ autoComplete: 'email' }} admin={{ autoComplete: 'email' }}
label="Email Address" label={i18n.t('general:emailAddress')}
// label={t('general:emailAddress')}
name="email" name="email"
required required
/> />
<FormSubmit> <FormSubmit>{i18n.t('general:submit')}</FormSubmit>
Submit
{/* {t('general:submit')} */}
</FormSubmit>
</Form> </Form>
<Link href={`${admin}/login`}> <Link href={`${admin}/login`}>{i18n.t('authentication:backToLogin')}</Link>
Back to Login
{/* {t('backToLogin')} */}
</Link>
</MinimalTemplate> </MinimalTemplate>
) )
} }

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import React, { Fragment, useEffect } from 'react' import React, { Fragment, useEffect } from 'react'
import { useAuth } from '../../../../ui/src/providers/Auth' import { useAuth } from '../../../../ui/src/providers/Auth'
import { Button } from '@payloadcms/ui' import { Button, useTranslation } from '@payloadcms/ui'
export const LogoutClient: React.FC<{ export const LogoutClient: React.FC<{
inactivity?: boolean inactivity?: boolean
@@ -11,8 +11,8 @@ export const LogoutClient: React.FC<{
const { inactivity, adminRoute, redirect } = props const { inactivity, adminRoute, redirect } = props
const [isLoggingOut, setIsLoggingOut] = React.useState<boolean | undefined>(undefined) const [isLoggingOut, setIsLoggingOut] = React.useState<boolean | undefined>(undefined)
const [hasLoggedOut, setHasLoggedOut] = React.useState<boolean | undefined>(undefined) const { logOut } = useAuth()
const { logOut, user } = useAuth() const { t } = useTranslation()
useEffect(() => { useEffect(() => {
if (!isLoggingOut) { if (!isLoggingOut) {
@@ -24,18 +24,8 @@ export const LogoutClient: React.FC<{
if (isLoggingOut) { if (isLoggingOut) {
return ( return (
<Fragment> <Fragment>
{inactivity && ( {inactivity && <h2>{t('authentication:loggedOutInactivity')}</h2>}
<h2> {!inactivity && <h2>{t('authentication:loggedOutSuccessfully')}</h2>}
Logged Out Due To Inactivity
{/* {t('loggedOutInactivity')} */}
</h2>
)}
{!inactivity && (
<h2>
Logged Out Successfully
{/* {t('loggedOutSuccessfully')} */}
</h2>
)}
<Button <Button
buttonStyle="secondary" buttonStyle="secondary"
el="link" el="link"
@@ -43,12 +33,12 @@ export const LogoutClient: React.FC<{
redirect && redirect.length > 0 ? `?redirect=${encodeURIComponent(redirect)}` : '' redirect && redirect.length > 0 ? `?redirect=${encodeURIComponent(redirect)}` : ''
}`} }`}
> >
Log Back In {t('authentication:logBackIn')}
{/* {t('logBackIn')} */}
</Button> </Button>
</Fragment> </Fragment>
) )
} }
// TODO(i18n): needs translation in all languages
return <Fragment>Logging Out...</Fragment> return <Fragment>Logging Out...</Fragment>
} }

View File

@@ -3,10 +3,10 @@ import React from 'react'
import { MinimalTemplate, Button } from '@payloadcms/ui' import { MinimalTemplate, Button } from '@payloadcms/ui'
import { meta } from '../../utilities/meta' import { meta } from '../../utilities/meta'
import './index.scss' import './index.scss'
import i18n from 'i18next'
import { Metadata } from 'next' import { Metadata } from 'next'
import { SanitizedConfig } from 'payload/types' import { SanitizedConfig } from 'payload/types'
import { LogoutClient } from './LogoutClient' import { LogoutClient } from './LogoutClient'
import { getNextT } from '../../utilities/getNextT'
const baseClass = 'logout' const baseClass = 'logout'
@@ -14,13 +14,18 @@ export const generateMetadata = async ({
config, config,
}: { }: {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
}): Promise<Metadata> => }): Promise<Metadata> => {
meta({ const t = getNextT({
title: i18n.t('logout'), config: await config,
description: `${i18n.t('logoutUser')}`, })
keywords: `${i18n.t('logout')}`,
return meta({
title: t('authentication:logout'),
description: `${t('authentication:logoutUser')}`,
keywords: `${t('authentication:logout')}`,
config, config,
}) })
}
export const Logout: React.FC<{ export const Logout: React.FC<{
inactivity?: boolean inactivity?: boolean

View File

@@ -1,7 +1,7 @@
'use client' 'use client'
import React from 'react' import React from 'react'
import { Button, Gutter, useStepNav, useConfig } from '@payloadcms/ui' import { Button, Gutter, useStepNav, useConfig, useTranslation } from '@payloadcms/ui'
// import Meta from '../../utilities/Meta' // import Meta from '../../utilities/Meta'
import './index.scss' import './index.scss'
@@ -13,6 +13,7 @@ const NotFound: React.FC<{
const { marginTop } = props const { marginTop } = props
const { setStepNav } = useStepNav() const { setStepNav } = useStepNav()
const { t } = useTranslation()
const { const {
routes: { admin }, routes: { admin },
@@ -21,7 +22,7 @@ const NotFound: React.FC<{
// useEffect(() => { // useEffect(() => {
// setStepNav([ // setStepNav([
// { // {
// label: t('notFound'), // label: t('general:notFound'),
// }, // },
// ]) // ])
// }, [setStepNav, t]) // }, [setStepNav, t])
@@ -33,22 +34,15 @@ const NotFound: React.FC<{
.join(' ')} .join(' ')}
> >
{/* <Meta {/* <Meta
description={t('pageNotFound')} description={t('general:pageNotFound')}
keywords={`404 ${t('notFound')}`} keywords={`404 ${t('general:notFound')}`}
title={t('notFound')} title={t('general:notFound')}
/> */} /> */}
<Gutter className={`${baseClass}__wrap`}> <Gutter className={`${baseClass}__wrap`}>
<h1> <h1>{t('general:nothingFound')}</h1>
Nothing Found <p>{t('general:sorryNotFound')}</p>
{/* {t('nothingFound')} */}
</h1>
<p>
Sorry, we couldn't find what you were looking for.
{/* {t('sorryNotFound')} */}
</p>
<Button className={`${baseClass}__button`} el="link" to={`${admin}`}> <Button className={`${baseClass}__button`} el="link" to={`${admin}`}>
Back to Dashboard {t('general:backToDashboard')}
{/* {t('backToDashboard')} */}
</Button> </Button>
</Gutter> </Gutter>
</div> </div>

View File

@@ -14,9 +14,9 @@ import './index.scss'
import { SanitizedConfig } from 'payload/types' import { SanitizedConfig } from 'payload/types'
import Link from 'next/link' import Link from 'next/link'
import { initPage } from '../../utilities/initPage' import { initPage } from '../../utilities/initPage'
import i18n from 'i18next'
import { Metadata } from 'next' import { Metadata } from 'next'
import { meta } from '../../utilities/meta' import { meta } from '../../utilities/meta'
import { getNextT } from '../../utilities/getNextT'
const baseClass = 'reset-password' const baseClass = 'reset-password'
@@ -24,19 +24,24 @@ export const generateMetadata = async ({
config, config,
}: { }: {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
}): Promise<Metadata> => }): Promise<Metadata> => {
meta({ const t = getNextT({
title: i18n.t('resetPassword'), config: await config,
description: i18n.t('resetPassword'), })
keywords: i18n.t('resetPassword'),
return meta({
title: t('authentication:resetPassword'),
description: t('authentication:resetPassword'),
keywords: t('authentication:resetPassword'),
config, config,
}) })
}
export const ResetPassword: React.FC<{ export const ResetPassword: React.FC<{
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
token: string token: string
}> = async ({ config: configPromise, token }) => { }> = async ({ config: configPromise, token }) => {
const { config, user } = await initPage({ configPromise }) const { config, user, i18n } = await initPage({ configPromise })
const { const {
admin: { logoutRoute, user: userSlug }, admin: { logoutRoute, user: userSlug },
@@ -50,7 +55,7 @@ export const ResetPassword: React.FC<{
// history.push(`${admin}`) // history.push(`${admin}`)
// } else { // } else {
// history.push(`${admin}/login`) // history.push(`${admin}/login`)
// toast.success(t('general:updatedSuccessfully'), { autoClose: 3000 }) // toast.success(i18n.t('general:updatedSuccessfully'), { autoClose: 3000 })
// } // }
// } // }
@@ -58,10 +63,7 @@ export const ResetPassword: React.FC<{
return ( return (
<MinimalTemplate className={baseClass}> <MinimalTemplate className={baseClass}>
<div className={`${baseClass}__wrap`}> <div className={`${baseClass}__wrap`}>
<h1> <h1>{i18n.t('authentication:alreadyLoggedIn')}</h1>
Already Logged In
{/* {t('alreadyLoggedIn')} */}
</h1>
<p> <p>
<Translation <Translation
t={i18n.t} t={i18n.t}
@@ -73,8 +75,7 @@ export const ResetPassword: React.FC<{
</p> </p>
<br /> <br />
<Button buttonStyle="secondary" el="link" to={admin}> <Button buttonStyle="secondary" el="link" to={admin}>
Back to Dashboard {i18n.t('general:backToDashboard')}
{/* {t('general:backToDashboard')} */}
</Button> </Button>
</div> </div>
</MinimalTemplate> </MinimalTemplate>
@@ -84,8 +85,7 @@ export const ResetPassword: React.FC<{
return ( return (
<MinimalTemplate className={baseClass}> <MinimalTemplate className={baseClass}>
<div className={`${baseClass}__wrap`}> <div className={`${baseClass}__wrap`}>
Reset Password <h1>{i18n.t('authentication:resetPassword')}</h1>
{/* <h1>{t('resetPassword')}</h1> */}
<Form <Form
action={`${serverURL}${api}/${userSlug}/reset-password`} action={`${serverURL}${api}/${userSlug}/reset-password`}
method="POST" method="POST"
@@ -94,17 +94,13 @@ export const ResetPassword: React.FC<{
> >
<Password <Password
autoComplete="off" autoComplete="off"
label="New Password" label={i18n.t('authentication:newPassword')}
// label={t('newPassword')}
name="password" name="password"
required required
/> />
<ConfirmPassword /> <ConfirmPassword />
<HiddenInput name="token" value={token} /> <HiddenInput name="token" value={token} />
<FormSubmit> <FormSubmit>{i18n.t('authentication:resetPassword')}</FormSubmit>
Reset Password
{/* {t('resetPassword')} */}
</FormSubmit>
</Form> </Form>
</div> </div>
</MinimalTemplate> </MinimalTemplate>

View File

@@ -0,0 +1,18 @@
'use client'
import React from 'react'
import { Button, useTranslation } from '@payloadcms/ui'
export const UnauthorizedClient: React.FC<{ logoutRoute: string }> = ({ logoutRoute }) => {
const { t } = useTranslation()
return (
<>
<h2>{t('error:unauthorized')}</h2>
<p>{t('error:notAllowedToAccessPage')}</p>
<br />
<Button el="link" to={logoutRoute}>
{t('authentication:logOut')}
</Button>
</>
)
}

View File

@@ -1,22 +1,28 @@
import React from 'react' import React from 'react'
import { MinimalTemplate, Button } from '@payloadcms/ui' import { MinimalTemplate } from '@payloadcms/ui'
import { SanitizedConfig } from 'payload/types' import { SanitizedConfig } from 'payload/types'
import { meta } from '../../utilities/meta' import { meta } from '../../utilities/meta'
import { Metadata } from 'next' import { Metadata } from 'next'
import i18n from 'i18next' import { getNextT } from '../../utilities/getNextT'
import { UnauthorizedClient } from './UnauthorizedClient'
export const generateMetadata = async ({ export const generateMetadata = async ({
config, config,
}: { }: {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
}): Promise<Metadata> => }): Promise<Metadata> => {
meta({ const t = getNextT({
title: i18n.t('error:unauthorized'), config: await config,
description: i18n.t('error:unauthorized'), })
keywords: i18n.t('error:unauthorized'),
return meta({
title: t('error:unauthorized'),
description: t('error:unauthorized'),
keywords: t('error:unauthorized'),
config, config,
}) })
}
export const Unauthorized: React.FC<{ export const Unauthorized: React.FC<{
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
@@ -30,19 +36,7 @@ export const Unauthorized: React.FC<{
return ( return (
<MinimalTemplate className="unauthorized"> <MinimalTemplate className="unauthorized">
<h2> <UnauthorizedClient logoutRoute={`${admin}${logoutRoute}`} />
Unauthorized
{/* {t('error:unauthorized')} */}
</h2>
<p>
Not Allowed
{/* {t('error:notAllowedToAccessPage')} */}
</p>
<br />
<Button el="link" to={`${admin}${logoutRoute}`}>
Log out
{/* {t('authentication:logOut')} */}
</Button>
</MinimalTemplate> </MinimalTemplate>
) )
} }

View File

@@ -6,8 +6,8 @@ import { initPage } from '../../utilities/initPage'
import { SanitizedConfig } from 'payload/types' import { SanitizedConfig } from 'payload/types'
import { redirect } from 'next/navigation' import { redirect } from 'next/navigation'
import { Metadata } from 'next' import { Metadata } from 'next'
import i18n from 'i18next'
import { meta } from '../../utilities/meta' import { meta } from '../../utilities/meta'
import { getNextT } from '../../utilities/getNextT'
const baseClass = 'verify' const baseClass = 'verify'
@@ -15,13 +15,18 @@ export const generateMetadata = async ({
config, config,
}: { }: {
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
}): Promise<Metadata> => }): Promise<Metadata> => {
meta({ const t = getNextT({
description: i18n.t('verifyUser'), config: await config,
keywords: i18n.t('verify'), })
title: i18n.t('verify'),
return meta({
description: t('authentication:verifyUser'),
keywords: t('authentication:verify'),
title: t('authentication:verify'),
config, config,
}) })
}
export const Verify: React.FC<{ export const Verify: React.FC<{
config: Promise<SanitizedConfig> config: Promise<SanitizedConfig>
@@ -30,7 +35,7 @@ export const Verify: React.FC<{
config: configPromise, config: configPromise,
// token // token
}) => { }) => {
const { config, user } = await initPage({ configPromise }) const { config, user, i18n } = await initPage({ configPromise })
const { const {
admin: { user: userSlug }, admin: { user: userSlug },
@@ -60,10 +65,9 @@ export const Verify: React.FC<{
} }
const getText = () => { const getText = () => {
return 'Verify' if (verifyResult?.status === 200) return i18n.t('authentication:verifiedSuccessfully')
// if (verifyResult?.status === 200) return t('verifiedSuccessfully') if (verifyResult?.status === 202) return i18n.t('authentication:alreadyActivated')
// if (verifyResult?.status === 202) return t('alreadyActivated') return i18n.t('authentication:unableToVerify')
// return t('unableToVerify')
} }
return ( return (
@@ -74,8 +78,7 @@ export const Verify: React.FC<{
<h2>{getText()}</h2> <h2>{getText()}</h2>
{verifyResult?.status === 200 && ( {verifyResult?.status === 200 && (
<Button buttonStyle="secondary" el="link" to={`${adminRoute}/login`}> <Button buttonStyle="secondary" el="link" to={`${adminRoute}/login`}>
Login {i18n.t('authentication:login')}
{/* {t('login')} */}
</Button> </Button>
)} )}
</MinimalTemplate> </MinimalTemplate>

View File

@@ -9,6 +9,7 @@ import fieldComponents from '../RenderFieldsToDiff/fields'
import Restore from '../Restore' import Restore from '../Restore'
import './index.scss' import './index.scss'
import { mostRecentVersionOption } from '../shared' import { mostRecentVersionOption } from '../shared'
import { getTranslation } from '@payloadcms/translations'
const baseClass = 'view-version' const baseClass = 'view-version'
@@ -52,8 +53,7 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
docLabel = mostRecentDoc[useAsTitle] docLabel = mostRecentDoc[useAsTitle]
} }
} else { } else {
docLabel = 'Untitled' docLabel = `[${i18n.t('general:untitled')}]`
// docLabel = `[${t('general:untitled')}]`
} }
} else { } else {
docLabel = mostRecentDoc.id docLabel = mostRecentDoc.id
@@ -62,9 +62,7 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
nav = [ nav = [
{ {
label: label: getTranslation(collectionConfig.labels.plural, i18n),
typeof collectionConfig.labels.plural === 'string' ? collectionConfig.labels.plural : '', // TODO: fix this (see below)
// label: getTranslation(collectionConfig.labels.plural, i18n),
url: `${admin}/collections/${collectionConfig.slug}`, url: `${admin}/collections/${collectionConfig.slug}`,
}, },
{ {
@@ -139,10 +137,9 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
<Gutter className={`${baseClass}__wrap`}> <Gutter className={`${baseClass}__wrap`}>
<div className={`${baseClass}__header-wrap`}> <div className={`${baseClass}__header-wrap`}>
<p className={`${baseClass}__created-at`}> <p className={`${baseClass}__created-at`}>
Version Created On {i18n.t('versionCreatedOn', {
{/* {t('versionCreatedOn', { version: i18n.t(doc?.autosave ? 'autosavedVersion' : 'version'),
version: t(doc?.autosave ? 'autosavedVersion' : 'version'), })}
})} */}
</p> </p>
<header className={`${baseClass}__header`}> <header className={`${baseClass}__header`}>
<h2>{formattedCreatedAt}</h2> <h2>{formattedCreatedAt}</h2>
@@ -184,6 +181,9 @@ export const DefaultVersionView: React.FC<DefaultVersionsViewProps> = ({
: [] : []
} }
version={doc?.version} version={doc?.version}
i18n={i18n}
locale={locale}
config={config}
/> />
)} )}
</Gutter> </Gutter>

View File

@@ -20,6 +20,8 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
locales, locales,
permissions, permissions,
version, version,
i18n,
config,
}) => { }) => {
const versionRowCount = Array.isArray(version) ? version.length : 0 const versionRowCount = Array.isArray(version) ? version.length : 0
const comparisonRowCount = Array.isArray(comparison) ? comparison.length : 0 const comparisonRowCount = Array.isArray(comparison) ? comparison.length : 0
@@ -30,8 +32,7 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
{field.label && ( {field.label && (
<Label> <Label>
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>} {locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
{field.label} {getTranslation(field.label, i18n)}
{/* {getTranslation(field.label, i18n)} */}
</Label> </Label>
)} )}
{maxRows > 0 && ( {maxRows > 0 && (
@@ -48,8 +49,7 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
subFields = [ subFields = [
{ {
name: 'blockType', name: 'blockType',
label: 'Block Type', // TODO: i18n label: i18n.t('fields:blockType'),
// label: t('fields:blockType'),
type: 'text', type: 'text',
}, },
] ]
@@ -86,6 +86,9 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
)} )}
locales={locales} locales={locales}
version={versionRow} version={versionRow}
i18n={i18n}
locale={locale}
config={config}
/> />
</div> </div>
) )
@@ -94,12 +97,11 @@ const Iterable: React.FC<Props & { field: ArrayField | BlockField }> = ({
)} )}
{maxRows === 0 && ( {maxRows === 0 && (
<div className={`${baseClass}__no-rows`}> <div className={`${baseClass}__no-rows`}>
No rows found {i18n.t('noRowsFound', {
{/* {t('noRowsFound', {
label: field.labels?.plural label: field.labels?.plural
? getTranslation(field.labels?.plural, i18n) ? getTranslation(field.labels?.plural, i18n)
: t('general:rows'), : i18n.t('general:rows'),
})} */} })}
</div> </div>
)} )}
</div> </div>

View File

@@ -19,17 +19,15 @@ const Nested: React.FC<Props & { field: FieldWithSubFields }> = ({
locales, locales,
permissions, permissions,
version, version,
i18n,
config,
}) => { }) => {
// const { i18n } = useTranslation()
return ( return (
<div className={baseClass}> <div className={baseClass}>
{field.label && ( {field.label && (
<Label> <Label>
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>} {locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
{field.label} {getTranslation(field.label, i18n)}
// TODO(i18n)
{/* {getTranslation(field.label, i18n)} */}
</Label> </Label>
)} )}
<div <div
@@ -44,6 +42,9 @@ const Nested: React.FC<Props & { field: FieldWithSubFields }> = ({
fields={field.fields} fields={field.fields}
locales={locales} locales={locales}
version={version} version={version}
i18n={i18n}
locale={locale}
config={config}
/> />
</div> </div>
</div> </div>

View File

@@ -1,8 +1,6 @@
'use client'
import React from 'react' import React from 'react'
import { getTranslation } from '@payloadcms/translations' import { getTranslation } from '@payloadcms/translations'
import ReactDiffViewer from 'react-diff-viewer-continued' import ReactDiffViewer from 'react-diff-viewer-continued'
import { useTranslation } from '@payloadcms/ui'
import type { RelationshipField, SanitizedCollectionConfig } from 'payload/types' import type { RelationshipField, SanitizedCollectionConfig } from 'payload/types'
import type { Props } from '../types' import type { Props } from '../types'
@@ -10,7 +8,6 @@ import type { Props } from '../types'
import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/types' import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/types'
import Label from '../../Label' import Label from '../../Label'
import { diffStyles } from '../styles' import { diffStyles } from '../styles'
import { useConfig, useLocale } from '@payloadcms/ui'
import './index.scss' import './index.scss'
@@ -72,14 +69,13 @@ const Relationship: React.FC<Props & { field: RelationshipField }> = ({
comparison, comparison,
field, field,
version, version,
i18n,
locale,
config: { collections },
}) => { }) => {
const { collections } = useConfig()
const { i18n, t } = useTranslation()
const { code: locale } = useLocale()
let placeholder = '' let placeholder = ''
if (version === comparison) placeholder = `[${t('general:noValue')}]` if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
let versionToRender = version let versionToRender = version
let comparisonToRender = comparison let comparisonToRender = comparison

View File

@@ -1,6 +1,4 @@
import type { i18n as Ii18n } from 'i18next' import { getTranslation, I18n } from '@payloadcms/translations'
import { getTranslation } from '@payloadcms/translations'
import React from 'react' import React from 'react'
import { DiffMethod } from 'react-diff-viewer-continued' import { DiffMethod } from 'react-diff-viewer-continued'
@@ -34,31 +32,21 @@ const getOptionsToRender = (
const getTranslatedOptions = ( const getTranslatedOptions = (
options: (OptionObject | string)[] | OptionObject | string, options: (OptionObject | string)[] | OptionObject | string,
i18n: Ii18n, i18n: I18n,
): string => { ): string => {
if (Array.isArray(options)) { if (Array.isArray(options)) {
return ( return options
options .map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n)))
// TODO: fix this .join(', ')
// @ts-ignore-next-line
.map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n)))
.join(', ')
)
} }
// TODO: fix this
// @ts-ignore-next-line
return typeof options === 'string' ? options : getTranslation(options.label, i18n) return typeof options === 'string' ? options : getTranslation(options.label, i18n)
} }
const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, version }) => { const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, version, i18n }) => {
let placeholder = '' let placeholder = ''
// const { i18n, t } = useTranslation('general')
const t = (key: string) => key // TODO
const i18n = {
options: {},
} as Ii18n // TODO
if (version === comparison) placeholder = `[${t('noValue')}]` if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
const comparisonToRender = const comparisonToRender =
typeof comparison !== 'undefined' typeof comparison !== 'undefined'
@@ -73,8 +61,6 @@ const Select: React.FC<Props> = ({ comparison, diffMethod, field, locale, versio
<div className={baseClass}> <div className={baseClass}>
<Label> <Label>
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>} {locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
{/* TODO: fix this
@ts-ignore-next-line */}
{getTranslation(field.label, i18n)} {getTranslation(field.label, i18n)}
</Label> </Label>
<DiffViewer <DiffViewer

View File

@@ -15,6 +15,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
locales, locales,
permissions, permissions,
version, version,
i18n,
config,
locale,
}) => ( }) => (
<div className={baseClass}> <div className={baseClass}>
<div className={`${baseClass}__wrap`}> <div className={`${baseClass}__wrap`}>
@@ -29,6 +32,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
locales={locales} locales={locales}
permissions={permissions} permissions={permissions}
version={version?.[tab.name]} version={version?.[tab.name]}
i18n={i18n}
config={config}
locale={locale}
/> />
) )
} }
@@ -42,6 +48,9 @@ const Tabs: React.FC<Props & { field: TabsField }> = ({
key={i} key={i}
locales={locales} locales={locales}
version={version} version={version}
i18n={i18n}
config={config}
locale={locale}
/> />
) )
})} })}

View File

@@ -17,12 +17,11 @@ const Text: React.FC<Props> = ({
isRichText = false, isRichText = false,
locale, locale,
version, version,
i18n,
}) => { }) => {
let placeholder = '' let placeholder = ''
const t = (key: string) => key // TODO
const i18n = {} // TODO
if (version === comparison) placeholder = `[${t('noValue')}]` if (version === comparison) placeholder = `[${i18n.t('general:noValue')}]`
let versionToRender = version let versionToRender = version
let comparisonToRender = comparison let comparisonToRender = comparison
@@ -37,8 +36,7 @@ const Text: React.FC<Props> = ({
<Label> <Label>
{locale && <span className={`${baseClass}__locale-label`}>{locale}</span>} {locale && <span className={`${baseClass}__locale-label`}>{locale}</span>}
{typeof field.label === 'string' ? field.label : '[field-label]' /* TODO */} {typeof field.label === 'string' ? field.label : '[field-label]' /* TODO */}
// TODO(i18n) {getTranslation(field.label, i18n)}
{/* {getTranslation(field.label, i18n)} */}
</Label> </Label>
<DiffViewer <DiffViewer
comparisonToRender={comparisonToRender} comparisonToRender={comparisonToRender}

View File

@@ -2,6 +2,8 @@ import type React from 'react'
import type { DiffMethod } from 'react-diff-viewer-continued' import type { DiffMethod } from 'react-diff-viewer-continued'
import type { FieldPermissions } from 'payload/auth' import type { FieldPermissions } from 'payload/auth'
import type { I18n } from '@payloadcms/translations'
import { SanitizedConfig } from 'payload/types'
export type FieldComponents = Record<string, React.FC<Props>> export type FieldComponents = Record<string, React.FC<Props>>
@@ -12,8 +14,10 @@ export type Props = {
field: any field: any
fieldComponents: FieldComponents fieldComponents: FieldComponents
isRichText?: boolean isRichText?: boolean
locale?: string locale: string
locales?: string[] locales?: string[]
permissions?: Record<string, FieldPermissions> permissions?: Record<string, FieldPermissions>
version: any version: any
i18n: I18n
config: SanitizedConfig
} }

View File

@@ -18,6 +18,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
fields, fields,
locales, locales,
version, version,
i18n,
locale,
config,
}) => { }) => {
return ( return (
<div className={baseClass}> <div className={baseClass}>
@@ -60,6 +63,8 @@ const RenderFieldsToDiff: React.FC<Props> = ({
locales={locales} locales={locales}
permissions={subFieldPermissions} permissions={subFieldPermissions}
version={versionLocaleValue} version={versionLocaleValue}
i18n={i18n}
config={config}
/> />
</div> </div>
</div> </div>
@@ -80,6 +85,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
locales={locales} locales={locales}
permissions={subFieldPermissions} permissions={subFieldPermissions}
version={versionValue} version={versionValue}
i18n={i18n}
locale={locale}
config={config}
/> />
</div> </div>
) )
@@ -96,6 +104,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
key={i} key={i}
locales={locales} locales={locales}
version={version} version={version}
i18n={i18n}
locale={locale}
config={config}
/> />
) )
} }
@@ -112,6 +123,9 @@ const RenderFieldsToDiff: React.FC<Props> = ({
locales={locales} locales={locales}
permissions={fieldPermissions} permissions={fieldPermissions}
version={version} version={version}
i18n={i18n}
locale={locale}
config={config}
/> />
) )
} }

View File

@@ -1,6 +1,7 @@
import type { FieldPermissions } from 'payload/auth' import type { FieldPermissions } from 'payload/auth'
import type { Field } from 'payload/types' import type { Field, SanitizedConfig } from 'payload/types'
import type { FieldComponents } from './fields/types' import type { FieldComponents } from './fields/types'
import type { I18n } from '@payloadcms/translations'
export type Props = { export type Props = {
comparison: Record<string, any> comparison: Record<string, any>
@@ -9,4 +10,7 @@ export type Props = {
fields: Field[] fields: Field[]
locales: string[] locales: string[]
version: Record<string, any> version: Record<string, any>
i18n: I18n
config: SanitizedConfig
locale: string
} }

View File

@@ -6,12 +6,13 @@ import {
PerPage, PerPage,
Table, Table,
SetDocumentStepNav as SetStepNav, SetDocumentStepNav as SetStepNav,
EditViewProps,
} from '@payloadcms/ui' } from '@payloadcms/ui'
import { buildVersionColumns } from './columns' import { buildVersionColumns } from './columns'
import './index.scss' import './index.scss'
import { EditViewProps } from '@payloadcms/ui'
import { notFound } from 'next/navigation' import { notFound } from 'next/navigation'
import { getTranslation } from '@payloadcms/translations'
const baseClass = 'versions' const baseClass = 'versions'
@@ -58,7 +59,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
} }
docURL = `${serverURL}${api}/${slug}/${id}` docURL = `${serverURL}${api}/${slug}/${id}`
// entityLabel = getTranslation(collectionConfig.labels.singular, i18n) entityLabel = getTranslation(collectionConfig.labels.singular, i18n)
editURL = `${admin}/collections/${collectionSlug}/${id}` editURL = `${admin}/collections/${collectionSlug}/${id}`
} }
@@ -85,7 +86,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
} }
docURL = `${serverURL}${api}/globals/${globalSlug}` docURL = `${serverURL}${api}/globals/${globalSlug}`
// entityLabel = getTranslation(globalConfig.label, i18n) entityLabel = getTranslation(globalConfig.label, i18n)
editURL = `${admin}/globals/${globalSlug}` editURL = `${admin}/globals/${globalSlug}`
} }
@@ -108,24 +109,28 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
globalSlug={globalConfig?.slug} globalSlug={globalConfig?.slug}
id={id} id={id}
isEditing isEditing
view="Versions" // TODO; i18n
pluralLabel={collectionConfig?.labels?.plural} pluralLabel={collectionConfig?.labels?.plural}
// view={t('versions')} view={i18n.t('version:versions')}
/> />
{/* <LoadingOverlayToggle name="versions" show={isLoadingVersions} /> */} {/* <LoadingOverlayToggle name="versions" show={isLoadingVersions} /> */}
<main className={baseClass}> <main className={baseClass}>
{/* <Meta description={metaDesc} title={metaTitle} /> */} {/* <Meta description={metaDesc} title={metaTitle} /> */}
<Gutter className={`${baseClass}__wrap`}> <Gutter className={`${baseClass}__wrap`}>
{versionCount === 0 && ( {versionCount === 0 && (
<div className={`${baseClass}__no-versions`}>{/* {t('noFurtherVersionsFound')} */}</div> <div className={`${baseClass}__no-versions`}>
{i18n.t('version:noFurtherVersionsFound')}
</div>
)} )}
{versionCount > 0 && ( {versionCount > 0 && (
<React.Fragment> <React.Fragment>
{/* <div className={`${baseClass}__version-count`}> <div className={`${baseClass}__version-count`}>
{t(versionCount === 1 ? 'versionCount_one' : 'versionCount_many', { {i18n.t(
count: versionCount, versionCount === 1 ? 'version:versionCount_one' : 'version:versionCount_many',
})} {
</div> */} count: versionCount,
},
)}
</div>
<Table <Table
columns={buildVersionColumns({ columns={buildVersionColumns({
config, config,
@@ -154,7 +159,7 @@ export const VersionsView: React.FC<EditViewProps> = async (props) => {
{versionsData.totalPages > 1 && versionsData.totalPages !== versionsData.page {versionsData.totalPages > 1 && versionsData.totalPages !== versionsData.page
? versionsData.limit * versionsData.page ? versionsData.limit * versionsData.page
: versionsData.totalDocs}{' '} : versionsData.totalDocs}{' '}
{/* {t('of')} {versionsData.totalDocs} */} {i18n.t('general:of')} {versionsData.totalDocs}
</div> </div>
<PerPage <PerPage
limit={limit ? Number(limit) : 10} limit={limit ? Number(limit) : 10}

View File

@@ -181,15 +181,15 @@ const validateArrayLength: any = (
if (!required && arrayLength === 0) return true if (!required && arrayLength === 0) return true
if (minRows && arrayLength < minRows) { if (minRows && arrayLength < minRows) {
return t('validation:requiresAtLeast', { count: minRows, label: t('rows') }) return t('validation:requiresAtLeast', { count: minRows, label: t('general:rows') })
} }
if (maxRows && arrayLength > maxRows) { if (maxRows && arrayLength > maxRows) {
return t('validation:requiresNoMoreThan', { count: maxRows, label: t('rows') }) return t('validation:requiresNoMoreThan', { count: maxRows, label: t('general:rows') })
} }
if (required && !arrayLength) { if (required && !arrayLength) {
return t('validation:requiresAtLeast', { count: 1, label: t('row') }) return t('validation:requiresAtLeast', { count: 1, label: t('general:row') })
} }
return true return true
@@ -218,11 +218,11 @@ export const number: Validate<unknown, unknown, NumberField> = (
const numberValue = parseFloat(number as unknown as string) const numberValue = parseFloat(number as unknown as string)
if (typeof max === 'number' && numberValue > max) { if (typeof max === 'number' && numberValue > max) {
return t('validation:greaterThanMax', { label: t('value'), max, value }) return t('validation:greaterThanMax', { label: t('general:value'), max, value })
} }
if (typeof min === 'number' && numberValue < min) { if (typeof min === 'number' && numberValue < min) {
return t('validation:lessThanMin', { label: t('value'), min, value }) return t('validation:lessThanMin', { label: t('general:value'), min, value })
} }
} }
@@ -382,11 +382,19 @@ export const relationship: Validate<unknown, unknown, RelationshipField> = async
if (Array.isArray(value) && value.length > 0) { if (Array.isArray(value) && value.length > 0) {
if (minRows && value.length < minRows) { if (minRows && value.length < minRows) {
return t('validation:lessThanMin', { label: t('rows'), min: minRows, value: value.length }) return t('validation:lessThanMin', {
label: t('general:rows'),
min: minRows,
value: value.length,
})
} }
if (maxRows && value.length > maxRows) { if (maxRows && value.length > maxRows) {
return t('validation:greaterThanMax', { label: t('rows'), max: maxRows, value: value.length }) return t('validation:greaterThanMax', {
label: t('general:rows'),
max: maxRows,
value: value.length,
})
} }
} }

View File

@@ -74,16 +74,12 @@ export const DocumentControls: React.FC<{
{collectionConfig && !isEditing && !isAccountView && ( {collectionConfig && !isEditing && !isAccountView && (
<li className={`${baseClass}__list-item`}> <li className={`${baseClass}__list-item`}>
<p className={`${baseClass}__value`}> <p className={`${baseClass}__value`}>
Creating new{' '} {i18n.t('creatingNewLabel', {
{typeof collectionConfig?.labels?.singular === 'string'
? collectionConfig.labels.singular
: 'Doc'}
{/* {t('creatingNewLabel', {
label: label:
typeof collectionConfig?.labels?.singular === 'string' typeof collectionConfig?.labels?.singular === 'string'
? collectionConfig.labels.singular ? collectionConfig.labels.singular
: 'document', : 'document',
})} */} })}
</p> </p>
</li> </li>
)} )}
@@ -123,7 +119,7 @@ export const DocumentControls: React.FC<{
data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : '' data?.updatedAt ? formatDate(data?.updatedAt, dateFormat, i18n.language) : ''
} }
> >
<p className={`${baseClass}__label`}>{/* {t('lastModified')}:&nbsp; */}</p> <p className={`${baseClass}__label`}>{i18n.t('general:lastModified')}:&nbsp;</p>
{data?.updatedAt && ( {data?.updatedAt && (
<p className={`${baseClass}__value`}> <p className={`${baseClass}__value`}>
{formatDate(data.updatedAt, dateFormat, i18n.language)} {formatDate(data.updatedAt, dateFormat, i18n.language)}
@@ -138,7 +134,7 @@ export const DocumentControls: React.FC<{
data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : '' data?.createdAt ? formatDate(data?.createdAt, dateFormat, i18n.language) : ''
} }
> >
<p className={`${baseClass}__label`}>{/* {t('created')}:&nbsp; */}</p> <p className={`${baseClass}__label`}>{i18n.t('general:created')}:&nbsp;</p>
{data?.createdAt && ( {data?.createdAt && (
<p className={`${baseClass}__value`}> <p className={`${baseClass}__value`}>
{formatDate(data?.createdAt, dateFormat, i18n.language)} {formatDate(data?.createdAt, dateFormat, i18n.language)}
@@ -213,8 +209,7 @@ export const DocumentControls: React.FC<{
id="action-create" id="action-create"
to={`${adminRoute}/collections/${collectionConfig?.slug}/create`} to={`${adminRoute}/collections/${collectionConfig?.slug}/create`}
> >
Create New {i18n.t('general:createNew')}
{/* {t('createNew')} */}
</PopupList.Button> </PopupList.Button>
{!collectionConfig?.admin?.disableDuplicate && isEditing && ( {!collectionConfig?.admin?.disableDuplicate && isEditing && (
<DuplicateDocument <DuplicateDocument

View File

@@ -1,16 +1,22 @@
import React from 'react' import React from 'react'
import { fieldAffectsData } from 'payload/types'
import type { Props } from './types' import type { Props } from './types'
import { RenderCustomComponent } from '../../elements/RenderCustomComponent' import { RenderCustomComponent } from '../../elements/RenderCustomComponent'
import './index.scss' import './index.scss'
import { getTranslation } from '@payloadcms/translations'
const baseClass = 'render-fields' const baseClass = 'render-fields'
const RenderFields: React.FC<Props> = (props) => { const RenderFields: React.FC<Props> = (props) => {
const { className, fieldTypes, forceRender, margins, data, user, state } = props const { className, fieldTypes, forceRender, margins, data, user, state, i18n } = props
if ('fields' in props) { if ('fields' in props) {
if (!i18n) {
console.error('Need to implement i18n when calling RenderFields')
}
return ( return (
<div <div
className={[ className={[
@@ -73,11 +79,13 @@ const RenderFields: React.FC<Props> = (props) => {
return ( return (
<div className="missing-field" key={fieldIndex}> <div className="missing-field" key={fieldIndex}>
{/* {t('error:noMatchedField', { {i18n
label: fieldAffectsData(field) ? i18n.t('error:noMatchedField', {
? getTranslation(field.label || field.name, i18n) label: fieldAffectsData(field)
: field.path, ? getTranslation(field.label || field.name, i18n)
})} */} : field.path,
})
: 'Need to implement i18n when calling RenderFields'}
</div> </div>
) )
})} })}

View File

@@ -3,6 +3,7 @@ import type { Document, Field, FieldWithPath } from 'payload/types'
import type { ReducedField } from './filterFields' import type { ReducedField } from './filterFields'
import { Fields } from '../Form/types' import { Fields } from '../Form/types'
import { FieldTypes } from 'payload/config' import { FieldTypes } from 'payload/config'
import { I18n } from '@payloadcms/translations'
export type Props = { export type Props = {
className?: string className?: string
@@ -18,6 +19,7 @@ export type Props = {
} }
| FieldPermissions | FieldPermissions
readOnly?: boolean readOnly?: boolean
i18n?: I18n
} & ( } & (
| { | {
// Fields to be filtered by the component // Fields to be filtered by the component

View File

@@ -5,7 +5,7 @@ import Form from '../../forms/Form'
import { OperationProvider } from '../../providers/OperationProvider' import { OperationProvider } from '../../providers/OperationProvider'
import './index.scss' import './index.scss'
// import { getTranslation } from 'payload/utilities' // import { getTranslation } from '@payloadcms/translations'
import { DocumentControls } from '../../elements/DocumentControls' import { DocumentControls } from '../../elements/DocumentControls'
import { DocumentFields } from '../../elements/DocumentFields' import { DocumentFields } from '../../elements/DocumentFields'
import { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving' import { LeaveWithoutSaving } from '../../elements/LeaveWithoutSaving'
@@ -114,12 +114,12 @@ export const DefaultEditView: React.FC<EditViewProps> = async (props) => {
/> />
{/* <Meta {/* <Meta
description={`${isEditing ? t('editing') : t('creating')} - ${getTranslation( description={`${isEditing ? t('general:editing') : t('general:creating')} - ${getTranslation(
collection.labels.singular, collection.labels.singular,
i18n, i18n,
)}`} )}`}
keywords={`${getTranslation(collection.labels.singular, i18n)}, Payload, CMS`} keywords={`${getTranslation(collection.labels.singular, i18n)}, Payload, CMS`}
title={`${isEditing ? t('editing') : t('creating')} - ${getTranslation( title={`${isEditing ? t('general:editing') : t('general:creating')} - ${getTranslation(
collection.labels.singular, collection.labels.singular,
i18n, i18n,
)}`} )}`}

View File

@@ -39,7 +39,7 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
useAsTitle, useAsTitle,
} = {}, } = {},
fields, fields,
labels: { plural: pluralLabel }, labels: { plural: pluralLabel, singular: singularLabel } = {},
slug: collectionSlug, slug: collectionSlug,
}, },
customHeader, customHeader,
@@ -104,15 +104,15 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
{customHeader && customHeader} {customHeader && customHeader}
{!customHeader && ( {!customHeader && (
<Fragment> <Fragment>
<h1>{typeof pluralLabel === 'string' ? pluralLabel : pluralLabel['en']}</h1> <h1>{getTranslation(pluralLabel, i18n)}</h1>
{/* <h1>{getTranslation(pluralLabel, i18n)}</h1> */}
{hasCreatePermission && ( {hasCreatePermission && (
<Pill <Pill
// aria-label={t('createNewLabel', { label: getTranslation(singularLabel, i18n) })} aria-label={i18n.t('general:createNewLabel', {
label: getTranslation(singularLabel, i18n),
})}
to={newDocumentURL} to={newDocumentURL}
> >
Create New {i18n.t('general:createNew')}
{/* {t('createNew')} */}
</Pill> </Pill>
)} )}
{/* {!smallBreak && ( {/* {!smallBreak && (
@@ -152,11 +152,10 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
)} )}
{data.docs && data.docs.length === 0 && ( {data.docs && data.docs.length === 0 && (
<div className={`${baseClass}__no-results`}> <div className={`${baseClass}__no-results`}>
{/* <p>{t('noResults', { label: getTranslation(pluralLabel, i18n) })}</p> */} <p>{i18n.t('general:noResults', { label: getTranslation(pluralLabel, i18n) })}</p>
{hasCreatePermission && newDocumentURL && ( {hasCreatePermission && newDocumentURL && (
<Button el="link" to={newDocumentURL}> <Button el="link" to={newDocumentURL}>
Create New {i18n.t('general:createNewLabel', { label: getTranslation(singularLabel, i18n) })}
{/* {t('createNewLabel', { label: getTranslation(singularLabel, i18n) })} */}
</Button> </Button>
)} )}
</div> </div>
@@ -184,7 +183,7 @@ export const DefaultList: React.FC<DefaultListViewProps> = (props) => {
{data.totalPages > 1 && data.totalPages !== data.page {data.totalPages > 1 && data.totalPages !== data.page
? data.limit * data.page ? data.limit * data.page
: data.totalDocs}{' '} : data.totalDocs}{' '}
{/* {t('of')} {data.totalDocs} */} {i18n.t('general:of')} {data.totalDocs}
</div> </div>
<PerPage <PerPage
handleChange={handlePerPageChange} handleChange={handlePerPageChange}