Skip to content

Commit 900fed4

Browse files
authored
Merge pull request #193 from ethereum/translation-contributors-page
feat: Translation program contributors page
2 parents 4b2fbeb + 5fcdf5c commit 900fed4

File tree

2 files changed

+192
-0
lines changed

2 files changed

+192
-0
lines changed

src/lib/utils/translations.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ const getRequiredNamespacesForPath = (path: string) => {
5454
requiredNamespaces = [...requiredNamespaces, "page-index"]
5555
}
5656

57+
if (path === "/contributing/translation-program/contributors") {
58+
requiredNamespaces = [
59+
...requiredNamespaces,
60+
"page-contributing-translation-program-contributors",
61+
"page-languages",
62+
]
63+
}
64+
5765
if (path.startsWith("/community")) {
5866
requiredNamespaces = [...requiredNamespaces, "page-community"]
5967
}
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
import { useRouter } from "next/router"
2+
import { GetStaticProps } from "next/types"
3+
import { SSRConfig, useTranslation } from "next-i18next"
4+
import { serverSideTranslations } from "next-i18next/serverSideTranslations"
5+
import {
6+
Box,
7+
BoxProps,
8+
Flex,
9+
HeadingProps,
10+
ListItem,
11+
SimpleGrid,
12+
UnorderedList,
13+
} from "@chakra-ui/react"
14+
15+
import Breadcrumbs from "@/components/Breadcrumbs"
16+
import FeedbackCard from "@/components/FeedbackCard"
17+
import InlineLink from "@/components/Link"
18+
import OldHeading from "@/components/OldHeading"
19+
import Text from "@/components/OldText"
20+
import PageMetadata from "@/components/PageMetadata"
21+
22+
import { getLastDeployDate } from "@/lib/utils/getLastDeployDate"
23+
import { getRequiredNamespacesForPage } from "@/lib/utils/translations"
24+
25+
import allTimeData from "../../../data/translation-reports/alltime/alltime-data.json"
26+
27+
type Props = SSRConfig & {
28+
lastDeployDate: string
29+
}
30+
31+
export const getStaticProps = (async (context) => {
32+
const { locale } = context
33+
// load i18n required namespaces for the given page
34+
const requiredNamespaces = getRequiredNamespacesForPage(
35+
"/contributing/translation-program/contributors"
36+
)
37+
const lastDeployDate = getLastDeployDate()
38+
39+
return {
40+
props: {
41+
...(await serverSideTranslations(locale!, requiredNamespaces)),
42+
lastDeployDate,
43+
},
44+
}
45+
}) satisfies GetStaticProps<Props>
46+
47+
const Content = (props: BoxProps) => <Box py={4} px={10} w="full" {...props} />
48+
const ContentHeading = (props: HeadingProps) => (
49+
<OldHeading lineHeight={1.4} {...props} />
50+
)
51+
52+
const Contributors = () => {
53+
const { t } = useTranslation([
54+
"page-contributing-translation-program-contributors",
55+
"page-languages",
56+
])
57+
const router = useRouter()
58+
59+
// TODO: Remove specific user checks once Acolad has updated their usernames
60+
const translatorData =
61+
allTimeData.data.flatMap(
62+
// use flatMap to get cleaner object types withouts nulls
63+
(item) => {
64+
const user = item?.user
65+
if (!user) return []
66+
67+
const userName = user.username
68+
if (!userName) return []
69+
70+
const fullName = user.fullName ?? ""
71+
72+
return userName !== "ethdotorg" &&
73+
!userName.includes("LQS_") &&
74+
!userName.includes("REMOVED_USER") &&
75+
!userName.includes("Aco_") &&
76+
!fullName.includes("Aco_") &&
77+
!userName.includes("Acc_") &&
78+
!fullName.includes("Acc_") &&
79+
userName !== "Finnish_Sandberg" &&
80+
userName !== "Norwegian_Sandberg" &&
81+
userName !== "Swedish_Sandberg"
82+
? [
83+
{
84+
user: {
85+
username: userName,
86+
fullName: fullName,
87+
},
88+
},
89+
]
90+
: []
91+
}
92+
) ?? []
93+
94+
return (
95+
<Flex direction="column" align="center" w="full">
96+
<PageMetadata
97+
title={t(
98+
"page-contributing-translation-program-contributors-meta-title"
99+
)}
100+
description={t(
101+
"page-contributing-translation-program-contributors-meta-description"
102+
)}
103+
/>
104+
105+
<Content>
106+
<Breadcrumbs slug={router.asPath} mt={12} />
107+
<ContentHeading
108+
as="h1"
109+
fontSize={{ base: "2.5rem", md: "5xl" }}
110+
fontWeight={700}
111+
>
112+
{t("page-contributing-translation-program-contributors-title")}
113+
</ContentHeading>
114+
<ContentHeading
115+
as="h4"
116+
fontSize={{ base: "md", md: "xl" }}
117+
fontWeight={500}
118+
>
119+
<Text as="strong">
120+
{t(
121+
"page-contributing-translation-program-contributors-number-of-contributors"
122+
)}{" "}
123+
{translatorData.length}
124+
</Text>
125+
</ContentHeading>
126+
<Text>
127+
{t(
128+
"page-contributing-translation-program-contributors-our-translators-1"
129+
)}
130+
</Text>
131+
<Text>
132+
{t(
133+
"page-contributing-translation-program-contributors-our-translators-2"
134+
)}
135+
</Text>
136+
<Text>
137+
{t(
138+
"page-contributing-translation-program-contributors-our-translators-3"
139+
)}
140+
</Text>
141+
<Text>
142+
{t("page-languages:page-languages-interested")}{" "}
143+
<InlineLink to="/contributing/translation-program/">
144+
{t("page-languages:page-languages-learn-more")}
145+
</InlineLink>
146+
.
147+
</Text>
148+
<ContentHeading
149+
as="h2"
150+
fontSize={{ base: "2xl", md: "2rem" }}
151+
fontWeight={600}
152+
>
153+
{t("page-contributing-translation-program-contributors-thank-you")}
154+
</ContentHeading>
155+
<SimpleGrid as={UnorderedList} columns={[1, 2, 3, 4, 6]} ms="1.45rem">
156+
{translatorData
157+
.map(({ user }) => user.username)
158+
.sort((user1, user2) =>
159+
user1.toLowerCase().localeCompare(user2.toLowerCase())
160+
)
161+
.map((user) => {
162+
return (
163+
<ListItem key={user} color="text300">
164+
{user}
165+
</ListItem>
166+
)
167+
})}
168+
</SimpleGrid>
169+
<Text>
170+
{t("page-languages:page-languages-interested")}{" "}
171+
<InlineLink to="/contributing/translation-program/">
172+
{t("page-languages:page-languages-learn-more")}
173+
</InlineLink>
174+
.
175+
</Text>
176+
</Content>
177+
<Content>
178+
<FeedbackCard />
179+
</Content>
180+
</Flex>
181+
)
182+
}
183+
184+
export default Contributors

0 commit comments

Comments
 (0)