Skip to content

Commit 1ff7d79

Browse files
committed
feat: Translate event pages
1 parent 8d29c29 commit 1ff7d79

File tree

7 files changed

+57
-21
lines changed

7 files changed

+57
-21
lines changed

messages/en.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,17 @@
132132
"returnByDescription": "Select how long you would like to borrow the item for.",
133133
"submit": "Submit"
134134
}
135+
},
136+
"events": {
137+
"title": "Events",
138+
"activeEvents": "Active events",
139+
"upcomingEvents": "Upcoming events",
140+
"pastEvents": "Past events",
141+
"detailsAboutEvent": "Read more about {eventName}",
142+
"startsAt": "Starts at",
143+
"startedAt": "Started at",
144+
"endsAt": "Ends at",
145+
"endedAt": "Ended at",
146+
"backToEvents": "Back to Events"
135147
}
136148
}

messages/no.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,17 @@
132132
"returnByDescription": "Velg hvor lenge du ønsker å låne gjenstanden(e)",
133133
"submit": "Send"
134134
}
135+
},
136+
"events": {
137+
"title": "Arrangementer",
138+
"activeEvents": "Pågående arrangementer",
139+
"upcomingEvents": "Kommende arrangementer",
140+
"pastEvents": "Tidligere arrangementer",
141+
"detailsAboutEvent": "Les mer om {eventName}",
142+
"startsAt": "Starter kl.",
143+
"startedAt": "Startet kl.",
144+
"endsAt": "Slutter kl.",
145+
"endedAt": "Sluttet kl.",
146+
"backToEvents": "Tilbake til arrangementer"
135147
}
136148
}

src/app/[locale]/(default)/events/[id]/layout.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { Button } from '@/components/ui/Button';
22
import { ArrowLeftIcon } from 'lucide-react';
3+
import { getTranslations } from 'next-intl/server';
34
import Link from 'next/link';
45

5-
export default function EventDetailsLayout({
6+
export default async function EventDetailsLayout({
67
children,
78
}: { children: React.ReactNode }) {
9+
const t = await getTranslations('events');
810
return (
911
<>
1012
<Link href='/events'>
@@ -14,7 +16,7 @@ export default function EventDetailsLayout({
1416
aria-label='Back to Events'
1517
>
1618
<ArrowLeftIcon aria-hidden='true' />
17-
<span>Back to Events</span>
19+
<span>{t('backToEvents')}</span>
1820
</Button>
1921
</Link>
2022
{children}

src/app/[locale]/(default)/events/[id]/loading.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Avatar, AvatarImage } from '@/components/ui/Avatar';
22
import { Separator } from '@/components/ui/Separator';
3-
import { ArrowLeftIcon, CalendarIcon, MapPinIcon } from 'lucide-react';
43
import { Skeleton } from '@/components/ui/Skeleton';
4+
import { ArrowLeftIcon, CalendarIcon, MapPinIcon } from 'lucide-react';
55

66
export default function EventDetailsLoading() {
77
return (

src/app/[locale]/(default)/events/[id]/page.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ export default async function EventDetailsPage({
4444
const timeOptions = {
4545
hour: '2-digit',
4646
minute: '2-digit',
47+
hour12: false,
4748
} as const;
4849

49-
const formattedStartTime = startDate.toLocaleTimeString('en-GB', timeOptions);
50-
const formattedEndTime = endDate.toLocaleTimeString('en-GB', timeOptions);
51-
const formattedStartDay = startDate.toLocaleDateString('en-GB');
52-
const formattedEndDay = endDate.toLocaleDateString('en-GB');
50+
const formattedStartTime = startDate.toLocaleTimeString(locale, timeOptions);
51+
const formattedEndTime = endDate.toLocaleTimeString(locale, timeOptions);
52+
const formattedStartDay = startDate.toLocaleDateString(locale);
53+
const formattedEndDay = endDate.toLocaleDateString(locale);
5354

5455
return (
5556
<>

src/app/[locale]/(default)/events/page.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ export default async function EventsPage({
2525
}) {
2626
const { locale } = await params;
2727
setRequestLocale(locale);
28+
const t = await getTranslations('events');
29+
2830
return (
2931
<>
30-
<h1 className='my-4'>Events</h1>
31-
<h2 className='my-2'>Active events</h2>
32+
<h1 className='my-4'>{t('title')}</h1>
33+
<h2 className='my-2'>{t('activeEvents')}</h2>
3234
{events.slice(0, 1).map((event) => (
3335
<EventCard
3436
key={event.id}
@@ -39,10 +41,11 @@ export default async function EventsPage({
3941
imagePath={event.imagePath}
4042
startTime={new Date(event.startTime)}
4143
endTime={new Date(event.endTime)}
44+
locale={locale}
4245
_active
4346
/>
4447
))}
45-
<h2 className='my-4'>Upcoming events</h2>
48+
<h2 className='my-4'>{t('upcomingEvents')}</h2>
4649
<div className='grid grid-cols-1 gap-2 lg:grid-cols-2'>
4750
{events.slice(1, 5).map((event) => (
4851
<EventCard
@@ -54,12 +57,13 @@ export default async function EventsPage({
5457
imagePath={event.imagePath}
5558
startTime={new Date(event.startTime)}
5659
endTime={new Date(event.endTime)}
60+
locale={locale}
5761
wrapperClassName='lg:last:odd:col-span-2'
5862
cardClassName='h-full'
5963
/>
6064
))}
6165
</div>
62-
<h2 className='my-4'>Past events</h2>
66+
<h2 className='my-4'>{t('pastEvents')}</h2>
6367
<div className='grid grid-cols-1 gap-2 lg:grid-cols-2'>
6468
{events.slice(5).map((event) => (
6569
<EventCard
@@ -71,6 +75,7 @@ export default async function EventsPage({
7175
imagePath={event.imagePath}
7276
startTime={new Date(event.startTime)}
7377
endTime={new Date(event.endTime)}
78+
locale={locale}
7479
wrapperClassName='lg:last:odd:col-span-2'
7580
cardClassName='h-full'
7681
/>

src/components/events/EventCard.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99

1010
import { Avatar, AvatarImage } from '@/components/ui/Avatar';
1111
import { cx } from '@/lib/utils';
12+
import { getTranslations } from 'next-intl/server';
1213
import Link from 'next/link';
1314

1415
type EventCardProps = {
@@ -19,6 +20,7 @@ type EventCardProps = {
1920
imagePath?: string;
2021
startTime: Date;
2122
endTime: Date;
23+
locale: string;
2224
wrapperClassName?: string;
2325
cardClassName?: string;
2426
_active?: boolean;
@@ -28,26 +30,28 @@ type EventCardProps = {
2830
* A card for an event.
2931
* Only set the _active prop to true if you're testing active events.
3032
*/
31-
function EventCard(props: EventCardProps) {
33+
async function EventCard(props: EventCardProps) {
34+
const t = await getTranslations('events');
35+
3236
const dateOptions = { hour: '2-digit', minute: '2-digit' } as const;
3337
const formattedStartTime = props.startTime.toLocaleTimeString(
34-
'en-GB',
38+
props.locale,
3539
dateOptions,
3640
);
37-
const formattedStartDate = props.startTime.toLocaleDateString('en-GB');
41+
const formattedStartDate = props.startTime.toLocaleDateString(props.locale);
3842
const formattedEndTime = props.endTime.toLocaleTimeString(
39-
'en-GB',
43+
props.locale,
4044
dateOptions,
4145
);
42-
const formattedEndDate = props.endTime.toLocaleDateString('en-GB');
46+
const formattedEndDate = props.endTime.toLocaleDateString(props.locale);
4347

4448
const started = props.startTime < new Date() || props._active;
4549
const ended = props.endTime < new Date();
4650

4751
return (
4852
<Link
4953
href={`/events/${props.id}`}
50-
aria-label={`Read more about ${props.title}`}
54+
aria-label={t('detailsAboutEvent', { eventName: props.title })}
5155
className={props.wrapperClassName}
5256
>
5357
<Card
@@ -67,12 +71,12 @@ function EventCard(props: EventCardProps) {
6771
</CardContent>
6872
<CardFooter className='mt-auto flex-col gap-2'>
6973
<span>
70-
{started ? <>Started at</> : <>Starts at</>} {formattedStartTime},{' '}
71-
{formattedStartDate}
74+
{started ? <>{t('startedAt')}</> : <>{t('startsAt')}</>}{' '}
75+
{formattedStartTime}, {formattedStartDate}
7276
</span>
7377
<span>
74-
{ended ? <>Ended at</> : <>Ends at</>} {formattedEndTime},{' '}
75-
{formattedEndDate}
78+
{ended ? <>{t('endedAt')}</> : <>{t('endsAt')}</>}{' '}
79+
{formattedEndTime}, {formattedEndDate}
7680
</span>
7781
</CardFooter>
7882
</Card>

0 commit comments

Comments
 (0)