Skip to content

Commit b512385

Browse files
committed
fix: lang picker footer cta logic
1 parent 66d62a1 commit b512385

File tree

3 files changed

+59
-44
lines changed

3 files changed

+59
-44
lines changed

src/components/LanguagePicker/index.tsx

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
import { useParams } from "next/navigation"
44
import { useLocale } from "next-intl"
55

6+
import type { LocaleDisplayInfo } from "@/lib/types"
7+
68
import { ButtonLink } from "@/components/ui/buttons/Button"
79

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

12+
import { DEFAULT_LOCALE } from "@/lib/constants"
13+
1014
import {
1115
Command,
1216
CommandEmpty,
@@ -42,7 +46,8 @@ const LanguagePicker = ({
4246
const pathname = usePathname()
4347
const { push } = useRouter()
4448
const params = useParams()
45-
const { disclosure, languages } = useLanguagePicker(handleClose)
49+
const { disclosure, languages, intlLanguagePreference } =
50+
useLanguagePicker(handleClose)
4651
const { isOpen, setValue, onClose, onOpen } = disclosure
4752

4853
/**
@@ -98,6 +103,7 @@ const LanguagePicker = ({
98103
/>
99104

100105
<LanguagePickerFooter
106+
intlLanguagePreference={intlLanguagePreference}
101107
onTranslationProgramClick={handleBaseLinkClose}
102108
/>
103109
</DialogContent>
@@ -126,7 +132,10 @@ const LanguagePicker = ({
126132
}
127133
/>
128134

129-
<LanguagePickerFooter onTranslationProgramClick={handleBaseLinkClose} />
135+
<LanguagePickerFooter
136+
intlLanguagePreference={intlLanguagePreference}
137+
onTranslationProgramClick={handleBaseLinkClose}
138+
/>
130139
</PopoverContent>
131140
</Popover>
132141
)
@@ -187,21 +196,30 @@ const LanguagePickerMenu = ({ languages, onClose, onSelect }) => {
187196
)
188197
}
189198

190-
const LanguagePickerFooter = ({ onTranslationProgramClick }) => {
199+
const LanguagePickerFooter = ({
200+
intlLanguagePreference,
201+
onTranslationProgramClick,
202+
}: {
203+
intlLanguagePreference?: LocaleDisplayInfo
204+
onTranslationProgramClick: () => void
205+
}) => {
191206
const { t } = useTranslation("common")
192207
const locale = useLocale()
193-
208+
console.log({ intlLanguagePreference })
194209
return (
195210
<div className="sticky bottom-0 flex border-t-2 border-primary bg-primary-low-contrast p-0 pb-1 pt-1">
196211
<div className="flex w-full max-w-sm items-center justify-between px-4">
197212
<div className="flex min-w-0 flex-col items-start">
198-
{locale == "en" ? (
213+
{locale === DEFAULT_LOCALE ? (
199214
<p className="overflow-hidden text-ellipsis whitespace-nowrap text-xs font-bold text-body">
200-
Translate Ethereum.org
215+
{intlLanguagePreference
216+
? `${t("page-languages-translate-cta-title")} ${t(`language-${intlLanguagePreference.localeOption}`)}`
217+
: "Translate ethereum.org"}
201218
</p>
202219
) : (
203220
<p className="overflow-hidden text-ellipsis whitespace-nowrap text-xs font-bold text-body">
204-
Translate to {t(`language-${locale}`)}
221+
{t("page-languages-translate-cta-title")}{" "}
222+
{t(`language-${locale}`)}
205223
</p>
206224
)}
207225
<p className="text-xs text-body">

src/components/LanguagePicker/useLanguagePicker.tsx

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,48 @@ export const useLanguagePicker = (handleClose?: () => void) => {
1717
const { t } = useTranslation("common")
1818
const locale = useLocale()
1919

20-
const languages = useMemo<LocaleDisplayInfo[]>(() => {
21-
const locales = filterRealLocales(LOCALES_CODES)
22-
23-
// Get the preferred languages for the users browser
24-
const navLangs = typeof navigator !== "undefined" ? navigator.languages : []
25-
26-
// For each browser preference, reduce to the most specific match found in `locales` array
27-
const allBrowserLocales: Lang[] = navLangs
28-
.map(
29-
(navLang) =>
30-
locales?.reduce((acc, cur) => {
31-
if (cur.toLowerCase() === navLang.toLowerCase()) return cur
32-
if (
33-
navLang.toLowerCase().startsWith(cur.toLowerCase()) &&
34-
acc !== navLang
35-
)
36-
return cur
37-
return acc
38-
}, "") as Lang
39-
)
40-
.filter((i) => !!i) // Remove those without matches
41-
42-
// Remove duplicate matches
43-
const browserLocales = Array.from(new Set(allBrowserLocales))
44-
45-
return (
20+
// Get the preferred language for the users browser
21+
const [navLang] = typeof navigator !== "undefined" ? navigator.languages : []
22+
const locales = useMemo(() => filterRealLocales(LOCALES_CODES), [])
23+
const intlLocalePreference = useMemo(
24+
() =>
25+
locales?.reduce((acc, cur) => {
26+
if (cur.toLowerCase() === navLang.toLowerCase()) return cur
27+
if (
28+
navLang.toLowerCase().startsWith(cur.toLowerCase()) &&
29+
acc !== navLang
30+
)
31+
return cur
32+
return acc
33+
}, "") as Lang,
34+
[navLang, locales]
35+
)
36+
37+
const languages = useMemo<LocaleDisplayInfo[]>(
38+
() =>
4639
(locales as Lang[])
4740
?.map((localeOption) => {
4841
const displayInfo = localeToDisplayInfo(
4942
localeOption,
5043
locale as Lang,
5144
t
5245
)
53-
const isBrowserDefault = browserLocales.includes(localeOption)
46+
const isBrowserDefault = intlLocalePreference === localeOption
5447
return { ...displayInfo, isBrowserDefault }
5548
})
5649
.sort((a, b) => {
57-
const indexA = browserLocales.indexOf(a.localeOption as Lang)
58-
const indexB = browserLocales.indexOf(b.localeOption as Lang)
59-
if (indexA >= 0 && indexB >= 0) return indexA - indexB
60-
if (indexA >= 0) return -1
61-
if (indexB >= 0) return 1
62-
63-
return a.sourceName.localeCompare(b.sourceName)
64-
}) || []
65-
)
66-
}, [locale, t])
50+
// Always put the browser's preferred language first
51+
if (a.localeOption === intlLocalePreference) return -1
52+
if (b.localeOption === intlLocalePreference) return 1
53+
// Otherwise, sort by wordsApproved descending
54+
return (b.wordsApproved ?? 0) - (a.wordsApproved ?? 0)
55+
}) || [],
56+
[intlLocalePreference, locale, locales, t]
57+
)
58+
59+
const intlLanguagePreference = languages.find(
60+
(lang) => lang.localeOption === intlLocalePreference
61+
)
6762

6863
const { isOpen, setValue, ...menu } = useDisclosure()
6964

@@ -100,5 +95,6 @@ export const useLanguagePicker = (handleClose?: () => void) => {
10095
return {
10196
disclosure: { isOpen, setValue, onOpen, onClose },
10297
languages,
98+
intlLanguagePreference,
10399
}
104100
}

src/intl/en/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@
376376
"page-languages-translated": "translated",
377377
"page-languages-want-more-header": "Want to see ethereum.org in a different language?",
378378
"page-languages-want-more-link": "Translation Program",
379+
"page-languages-translate-cta-title": "Translate to",
379380
"page-languages-want-more-paragraph": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our",
380381
"page-languages-words": "words",
381382
"page-last-updated": "Page last updated",

0 commit comments

Comments
 (0)