Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@
import { useState } from "react"

import Emoji from "@/components/Emoji"
import { Image } from "@/components/Image"
import { Button } from "@/components/ui/buttons/Button"

import { cn } from "@/lib/utils/cn"

const AvatarWithFallback = ({
username,
avatarUrl,
}: {
username: string
avatarUrl: string
}) => {
const [imageError, setImageError] = useState(false)
import { translators } from "./leaderboard-data"

const AvatarWithFallback = ({ username }: { username: string }) => {
// Generate consistent avatar colors using design system colors
const avatarColors = [
"bg-primary",
Expand All @@ -42,33 +35,19 @@ const AvatarWithFallback = ({
const avatarColorClass = avatarColors[Math.abs(hash) % avatarColors.length]
const initials = username.slice(0, 1).toUpperCase()

if (imageError || !avatarUrl) {
return (
<div
className={cn(
"me-4 hidden h-[30px] w-[30px] items-center justify-center rounded-full text-sm font-semibold text-white sm:flex sm:h-10 sm:w-10",
avatarColorClass
)}
>
{initials}
</div>
)
}

return (
<div className="relative me-4 hidden h-[30px] w-[30px] sm:block sm:h-10 sm:w-10">
<Image
fill
className="rounded-full object-cover"
src={avatarUrl}
alt={username}
onError={() => setImageError(true)}
/>
<div
className={cn(
"me-4 hidden h-[30px] w-[30px] items-center justify-center rounded-full text-sm font-semibold text-white sm:flex sm:h-10 sm:w-10",
avatarColorClass
)}
>
{initials}
</div>
)
}

export const Leaderboard = ({ translators }) => {
export const Leaderboard = () => {
const [filterAmount, updateFilterAmount] = useState(10)

const showMore = () => {
Expand All @@ -91,14 +70,7 @@ export const Leaderboard = ({ translators }) => {
</div>
</div>
{translators.slice(0, filterAmount).map((translator, index) => {
const { username, avatarUrl, totalCosts } = translator

const transformedAvatarUrl = avatarUrl
? avatarUrl.replace(
"https://crowdin-static.downloads.crowdin.com",
"https://crowdin-static.cf-downloads.crowdin.com"
)
: avatarUrl
const { name, words } = translator

let emoji: string | null = null
if (index === 0) {
Expand All @@ -122,16 +94,13 @@ export const Leaderboard = ({ translators }) => {
)}
</div>
<div className="me-8 flex flex-row items-center break-words">
<AvatarWithFallback
username={username}
avatarUrl={transformedAvatarUrl}
/>
<div className="max-w-[100px] sm:max-w-none">{username}</div>
<AvatarWithFallback username={name} />
<div className="max-w-[100px] sm:max-w-none">{name}</div>
</div>
</div>
<div className="div-row flex min-w-[20%] items-start">
<Emoji text=":writing:" className="me-2 text-2xl sm:block" />
<p>{totalCosts}</p>
<p>{words}</p>
</div>
</div>
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
export const translators = [
{ name: "Osaa7coded", words: 120995 },
{ name: "Boluwatife (boluwatife_4523)", words: 110645 },
{ name: "Joe Chen (Joe-Chen)", words: 97349 },
{ name: "Ucadriotad", words: 77866 },
{ name: "Ukkasha Farqaleet (ukkaxah)", words: 68389 },
{ name: "Ajayi Daniel (DanielAyomide)", words: 63036 },
{ name: "Gagas Prasetyo (gagaspras14)", words: 61338 },
{ name: "Jorge Maldonado Ventura (jorgesumle)", words: 59269 },
{ name: "Fuji Ar (fuji.anggara10)", words: 58979 },
{ name: "Stefan Marinkov (StefanMarinkov)", words: 56918 },
{ name: "bajoma burton (Magolla)", words: 56379 },
{ name: "Sunday Abisoye (Abisoye01)", words: 54398 },
{ name: "Lê Hưng (theminhhung)", words: 53363 },
{ name: "George Kitsoukakis (mr_giorgos)", words: 49890 },
{ name: "Arthur Chibuike (Arthur_Owl)", words: 47000 },
{ name: "Nguyễn Đức Trọng (0xTrong90)", words: 44755 },
{ name: "Tristan-He", words: 43701 },
{ name: "Jokowdd", words: 40080 },
{ name: "Edike isreal (JoeyGodramsey)", words: 39012 },
{ name: "DOladoyin", words: 39009 },
{ name: "roifnaufal21", words: 37263 },
{ name: "Sarah jones (Sarah004)", words: 37096 },
{ name: "Carla (Carla78)", words: 36739 },
{ name: "Daniel Onyedikachukwu (Cashman001)", words: 36422 },
{ name: "Cesssa_Will", words: 35544 },
{ name: "Soyemi David Olasubomi (Dking2244)", words: 34203 },
{ name: "cryptocoinpurse.eth (cryptoraketeros)", words: 32484 },
{ name: "Satglow", words: 31682 },
{ name: "MXNTRADER1", words: 27323 },
{ name: "wosek_", words: 25595 },
{ name: "Nelson Ayo (Nolongerbehemoth)", words: 24236 },
{ name: "emmanuelogheneovo", words: 23914 },
{ name: "0xCm (comme.le.gnu)", words: 23178 },
{ name: "Đặng Hoàng Lâm (lamdanghoang)", words: 22929 },
{ name: "Shoque.eth (shoque_eth)", words: 22131 },
{ name: "Akins16", words: 18451 },
{ name: "Pio268000", words: 18407 },
{ name: "Bulela Gomoshe (bulela)", words: 18314 },
{ name: "Henderson Mateus (henderson.mateus1)", words: 17764 },
{ name: "Snazzy1000000", words: 17745 },
{ name: "Habibu Ridwan (Yahabibullah1)", words: 16590 },
{ name: "scarlet188888", words: 15887 },
{ name: "Rahayu Rafikahwulan Sari (RahayuRafika_12)", words: 15542 },
{ name: "Renan D (ReDzin)", words: 15516 },
{ name: "0xknife", words: 14783 },
{ name: "michael chinemelu (michaelchinemelu24)", words: 14470 },
{ name: "Moses Kayode (Dgwen)", words: 14248 },
{ name: "Michelle Mtoni (michellewambaya)", words: 14100 },
{ name: "XRion (Xrion)", words: 13112 },
{ name: "Saidu Sokoto (bibo7086)", words: 12821 },
{ name: "Amina Sulaiman (Ummey_ib)", words: 12371 },
{ name: "Ceci (hyperalchemy)", words: 12017 },
{ name: "Amarachukwu_Precious", words: 11833 },
{ name: "Saanu Funmi (saanufunmi04)", words: 11629 },
{ name: "Kehinde Olusanya (kolusanya4)", words: 11590 },
{ name: "Tijani Oyindamola (Damola37)", words: 11495 },
{ name: "Tukur Kwairanga (Kwairanga360)", words: 11313 },
{ name: "Anuoluwapo Shorinola (0xTianah)", words: 11075 },
{ name: "Kabir Adam (Ak.adamms)", words: 10781 },
{ name: "Emmanuel Ifediora (kenez)", words: 10153 },
{ name: "Jordi (breathejmp)", words: 10109 },
{ name: "Jeremiah Bulus (d_wordifyer)", words: 9559 },
{ name: "sophiesworld.", words: 8967 },
{ name: "Effect Chen (EffectChen)", words: 8463 },
{ name: "ZZip | zharjac.eth (zharjac)", words: 8438 },
{ name: "nathaniel nanle (nathanielnanle)", words: 8247 },
{ name: "SamJay", words: 8159 },
{ name: "itsxdamdam", words: 8036 },
{ name: "Olusanya Emmanuel (olusanyatee13)", words: 8032 },
{ name: "Adebodun Mayokun (mayor_)", words: 8025 },
{ name: "Blessing Samuel (dicethedev)", words: 7811 },
{ name: "ahmad abuzaid (0xOZ)", words: 7712 },
{ name: "Bogdan Dovbysh (dovbyshbgd)", words: 7601 },
{ name: "Hiroyuki Naito (HiroyukiNaito)", words: 7574 },
{ name: "Sunny Cheng (hmsc)", words: 7446 },
{ name: "Paul Eze (peze5724)", words: 7375 },
{ name: "Nazir Muhammad Ladan (Nazir01)", words: 7225 },
{ name: "Bhatti Studio (neemibhatti)", words: 7195 },
{ name: "Marafrika", words: 7073 },
{ name: "Huu Pham (giahuu5b)", words: 7036 },
{ name: "Val111", words: 6847 },
{ name: "Felix Elenwo (IAmLickz)", words: 6712 },
{ name: "Valarie ademba (valarieademba84)", words: 6708 },
{ name: "Oluwatobiloba Olusanya (oluwatobilobaolusanya)", words: 6521 },
{ name: "ItsRibery", words: 6321 },
{ name: "schole.eth (de_garden)", words: 6198 },
{ name: "Kwaku Amoakohene (KwakuAAnalyst)", words: 6081 },
{ name: "odytr", words: 5876 },
{ name: "mearaf tadewos (mearaf)", words: 5774 },
{ name: "Ademuyiwa Michael (MichaelKinggggg)", words: 5719 },
{ name: "Karim Nyumba (karimnyumba)", words: 5666 },
{ name: "DREY (Dreythegreat)", words: 5643 },
{ name: "Joseph Raji (noos3)", words: 5553 },
{ name: "Hưng Đoàn (hungdoanqdn)", words: 5369 },
{ name: "Aisha_sulaiman", words: 5299 },
{ name: "Sagitario", words: 5264 },
{ name: "Lowboy123", words: 4964 },
{ name: "Asseke Hypolithe (Hypolithe)", words: 4865 },
{ name: "Pedro (pedrovilela)", words: 4798 },
{ name: "Fefe Sho (fefesho)", words: 4704 },
{ name: "Ye Huang (ARarsenic)", words: 4696 },
{ name: "Gift Nkara (tulipunity)", words: 4599 },
{ name: "Ishaq Abubakar (Algebra-jr)", words: 4579 },
{ name: "Anastasia Dostanko (AnastasiaDostanko)", words: 4574 },
{ name: "Dosa Alexander (alexanderdosa)", words: 4535 },
{ name: "Ziko Isaac (zicotee)", words: 4485 },
{ name: "Barosky_Dev", words: 4138 },
{ name: "Mercy Aremu Modupe (Tweb3girl)", words: 4137 },
{ name: "Farouk Adam (NamedFarouk)", words: 4077 },
{ name: "Julien (Gregster31)", words: 4021 },
{ name: "BaelFire", words: 3908 },
{ name: "Emanuel Leonard (emanuelleonard)", words: 3886 },
{ name: "Chí Anh Hạ (ItsChiAnh)", words: 3848 },
{ name: "Bala Jessey (balajessey1943)", words: 3770 },
{ name: "Wilkins Morales (w1lkns)", words: 3757 },
{ name: "Kinako Mochihara (kinakomochihara)", words: 3562 },
{ name: "Anastasia Lumina (lumina.envisions)", words: 3505 },
{ name: "omsify", words: 3503 },
{ name: "Headwitch (headwitch)", words: 3464 },
{ name: "TOJIA (QueenTojia)", words: 3368 },
{ name: "Batlord77", words: 3276 },
{ name: "ODEWALE Timileyin Eunice (Temmytee)", words: 3233 },
{ name: "Igordost", words: 3183 },
{ name: "Agbo Joseph (nvestorajje)", words: 3154 },
{ name: "favour onyebuchi (favourbuchi)", words: 3171 },
{ name: "Ayinde", words: 2856 },
{ name: "Moses Joshua (Jaux)", words: 2843 },
{ name: "George Vincent (georgevin2000)", words: 2793 },
{ name: "robertdo216", words: 2711 },
{ name: "Zeke Toriola (zeketoriola)", words: 2653 },
{ name: "Son Nguyen (TSonn18)", words: 2574 },
{ name: "Jonas Neubert (Coram_Deo)", words: 2527 },
{ name: "Ishq_ibra", words: 2396 },
{ name: "Haruna Idris (harunaidrisguru)", words: 2373 },
{ name: "ninja (ninja2114)", words: 2312 },
{ name: "Bernieforyou", words: 2286 },
{ name: "Stormzy01", words: 2275 },
{ name: "Hammad Hussain (hammad_8881)", words: 2108 },
{ name: "AgataTekla", words: 2092 },
{ name: "Arinze Ezenwa (Dattebayo8523)", words: 2087 },
{ name: "omahs", words: 2067 },
{ name: "darasimi221", words: 2060 },
{ name: "Andre Owano (jakakelo)", words: 2004 },
{ name: "Flerygold", words: 1974 },
{ name: "dadabosade", words: 1961 },
{ name: "jay_baby7", words: 1927 },
{ name: "Manojkumar T (manojmanoj2222001)", words: 1819 },
{ name: "Youcee", words: 1801 },
{ name: "emmanuel agbaje (dypumping)", words: 1792 },
{ name: "4tunate_123", words: 1780 },
{ name: "Lion Prado (lionprado38)", words: 1720 },
{ name: "DaisyVerse", words: 1688 },
{ name: "oreoluwa David (david2k20)", words: 1686 },
{ name: "bayraqi", words: 1675 },
{ name: "Daveofspaceship", words: 1665 },
{ name: "Yungeasy", words: 1644 },
{ name: "Ajax_felixx", words: 1642 },
{ name: "Franklyn Ude (udefranklynchukwuka1)", words: 1641 },
{ name: "B4LIFE 🥷⌘ (B4LIFE34)", words: 1595 },
{ name: "Olukorede", words: 1579 },
{ name: "Myworldx", words: 1568 },
{ name: "Adeliz", words: 1564 },
{ name: "natal78", words: 1561 },
{ name: "Thel_ma", words: 1534 },
{ name: "Olabimpesolanke_20", words: 1530 },
{ name: "Fawaz Damilare (Dhami007)", words: 1489 },
{ name: "Praise Adekoya (adekoyapraise89)", words: 1471 },
{ name: "UsmanT", words: 1455 },
{ name: "FooEze", words: 1440 },
{ name: "Ademuyiwa Elijah (ademuyiwaelijah)", words: 1404 },
{ name: "Sophie247", words: 1377 },
{ name: "Narek 9523 (narek9523)", words: 1374 },
{ name: "semicof", words: 1373 },
{ name: "Kempmaple", words: 1360 },
{ name: "Joshjosh999", words: 1357 },
{ name: "Godwin Oluwaseun (Mkdartistry)", words: 1348 },
{ name: "Patiencist", words: 1348 },
{ name: "Eli.ej", words: 1343 },
{ name: "Đạt Nguyễn Minh (dfrvci)", words: 1336 },
{ name: "Lakeside0147", words: 1321 },
{ name: "Betty Afolabi (devduchess)", words: 1318 },
{ name: "sultan sekoni (BabafemiBraut)", words: 1313 },
{ name: "isinasli", words: 1299 },
{ name: "Sokolayam Adam (Halily)", words: 1296 },
{ name: "Elizabeth Ololade (Lolly08.)", words: 1271 },
{ name: "Fk_welding", words: 1266 },
{ name: "Akinotunla Ayomide (akinotunlaayomide005)", words: 1238 },
{ name: "Kassie", words: 1224 },
{ name: "AJC", words: 1222 },
{ name: "Palatable500", words: 1220 },
{ name: "Ollllllllllllllie", words: 1215 },
{ name: "Gogox", words: 1213 },
{ name: "Chimezie (Bigflery)", words: 1183 },
{ name: "Adewuyi Oluwafunmilayo (joyful_semi_09)", words: 1168 },
{ name: "Minh Huong (HuongTran)", words: 1167 },
{ name: "isabella de brito (britodeisabella)", words: 1164 },
{ name: "Creativity Enthusiast (CreativityEnthusiast)", words: 1156 },
{ name: "Katexoxo", words: 1156 },
{ name: "Oluwatobiloba AWORINDE (o.aworinde.fna2023062)", words: 1153 },
{ name: "ZxStim (zxstim)", words: 1151 },
{ name: "Ebenezar Tosin (tosben01)", words: 1122 },
{ name: "pojilina", words: 1121 },
{ name: "Samskid", words: 1115 },
{ name: "Hashpack Doctor (hashpackdoctor)", words: 1109 },
{ name: "Nobleatim", words: 1102 },
{ name: "Memex", words: 1098 },
{ name: "Just_living", words: 1095 },
{ name: "Akhighu Marvelous (marvelousakhighu)", words: 1093 },
{ name: "brano0197", words: 1090 },
{ name: "Cryptochad", words: 1071 },
{ name: "CAD852", words: 1064 },
{ name: "Eko Yanuarso Budi (ekoyanu99)", words: 1059 },
{ name: "Won (linguist_won)", words: 1034 },
{ name: "Jhammed", words: 1032 },
{ name: "Phenomenalme", words: 1027 },
{ name: "Elen_defi", words: 1022 },
{ name: "Temilayo", words: 1018 },
]
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,19 @@ import { APPLICATION_END_DATE } from "@/components/Translatathon/constants"
import PaperformCallToAction from "@/components/Translatathon/PaperformCallToAction"

import { getAppPageContributorInfo } from "@/lib/utils/contributors"
import { dataLoader } from "@/lib/utils/data/dataLoader"
import { isDateReached } from "@/lib/utils/date"
import { getMetadata } from "@/lib/utils/metadata"

import { BASE_TIME_UNIT } from "@/lib/constants"

import { Leaderboard } from "./_components/Leaderboard"
import TranslatathonLeaderboardJsonLD from "./page-jsonld"

import { fetchTranslatathonTranslators } from "@/lib/api/fetchTranslatathonTranslators"
import heroImg from "@/public/images/heroes/translatathon-hero.png"

// 24 hours
const REVALIDATE_TIME = BASE_TIME_UNIT * 24

const loadData = dataLoader(
[["translatathonTranslators", fetchTranslatathonTranslators]],
REVALIDATE_TIME * 1000
)

const Page = async ({ params }: { params: Promise<{ locale: string }> }) => {
const { locale } = await params

setRequestLocale(locale)

const [translatathonTranslators] = await loadData()

const heroProps = {
title: "2025 Ethereum.org Translatathon",
breadcrumbs: {
Expand Down Expand Up @@ -156,13 +142,7 @@ const Page = async ({ params }: { params: Promise<{ locale: string }> }) => {
Final scores will be announced after all the evaluations are
completed!
</p>
{translatathonTranslators.length > 0 ? (
<Leaderboard translators={translatathonTranslators} />
) : (
<div className="text-center text-body-medium">
No data available
</div>
)}
<Leaderboard />
</div>
{isDateReached(APPLICATION_END_DATE) && (
<div id="apply-now">
Expand Down
2 changes: 1 addition & 1 deletion app/[locale]/what-is-the-ethereum-network/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const Page = async ({ params }: { params: Promise<{ locale: Lang }> }) => {
const commitHistoryCache: CommitHistory = {}
const { contributors, lastEditLocaleTimestamp } =
await getAppPageContributorInfo(
"what-is-ethereum-network",
"what-is-the-ethereum-network",
locale as Lang,
commitHistoryCache
)
Expand Down
Loading
Loading