update language settings

This commit is contained in:
Kalidou Diagne
2024-01-30 18:07:16 +00:00
parent a1e392cddd
commit 0918ab7349
5 changed files with 97 additions and 25 deletions

View File

@@ -1,27 +1,90 @@
import type { InitOptions } from "i18next"
import { siteConfig } from "@/config/site"
export const fallbackLng = "en"
export const languages = [fallbackLng, "it", "ko", "fr", "zh-CN", "es"] as const
export type LocaleTypes = (typeof languages)[number]
export const defaultNS = "translation"
export const cookieName = "i18next"
export const LanguageMapping: Record<string, string> = {
en: "English",
it: "Italiano",
ko: "한국어",
fr: "Français",
"zh-CN": "中文",
es: "Español",
interface Language {
key: string
label: string
enabled?: boolean
}
/**
* List of languages
* @param key - language key
* @param label - language label
* @param enabled - enable or disable language (when disabled, it will not be shown in the language switcher)
*/
export const languageList: Language[] = [
{
key: "en",
label: "English",
enabled: true,
},
{
key: "it",
label: "Italiano",
enabled: true,
},
{
key: "ko",
label: "한국어",
enabled: false,
},
{
key: "fr",
label: "Français",
enabled: false,
},
{
key: "de",
label: "Deutsch",
enabled: false,
},
{
key: "ar",
label: "Arabic",
enabled: false,
},
{
key: "zh-CN",
label: "Chinese simpl.",
enabled: false,
},
{
key: "zh-TW",
label: "Chinese trad.",
enabled: false,
},
{
key: "es",
label: "Español",
enabled: false,
},
{
key: "ja",
label: "日本語",
enabled: false,
},
]
// list of only enabled languages
export const languagesItems: { label: string; value: string }[] =
Object.entries(LanguageMapping).map(([value, label]) => {
return {
label,
value,
}
}) ?? []
languageList
.filter((item) =>
siteConfig.showOnlyEnabledLanguages ? item.enabled : true
)
.map(({ key: value, label }) => {
return {
label,
value,
}
}) ?? []
export function getOptions(lng = fallbackLng, ns = defaultNS): InitOptions {
return {

View File

@@ -10,6 +10,7 @@ import HeaderVector from "@/public/icons/menu-burger.svg"
import { LangProps } from "@/types/common"
import { siteConfig } from "@/config/site"
import { cn } from "@/lib/utils"
import { useAppSettings } from "@/hooks/useAppSettings"
import {
Discord,
Github,
@@ -17,12 +18,13 @@ import {
Twitter,
} from "@/components/svgs/social-medias"
import { useTranslation } from "@/app/i18n/client"
import { LanguageMapping, languagesItems } from "@/app/i18n/settings"
import { languageList } from "@/app/i18n/settings"
import { Icons } from "./icons"
const LanguageSwitcher = ({ lang }: LangProps["params"]) => {
const [isOpen, setIsOpen] = useState(false)
const { activeLanguageLabel } = useAppSettings(lang)
if (!siteConfig?.showLanguageSwitcher) return null
@@ -37,13 +39,16 @@ const LanguageSwitcher = ({ lang }: LangProps["params"]) => {
>
<Icons.globe className="text-white" size={22} fill="white" />
<span className="text-base font-medium uppercase text-white">
{LanguageMapping[lang] ?? LanguageMapping["en"]}
{activeLanguageLabel}
</span>
<Icons.arrowDown />
</button>
{isOpen && (
<div className="ml-8 mt-4 flex flex-col gap-1">
{languagesItems?.map(({ label, value: languageKey }, index) => {
{languageList?.map(({ label, key: languageKey, enabled }, index) => {
const showLanguage = siteConfig.showOnlyEnabledLanguages && !enabled
if (showLanguage) return null // skip disabled languages
const isActive = languageKey === lang
return (
<Link

View File

@@ -3,11 +3,7 @@
import { siteConfig } from "@/config/site"
import { useAppSettings } from "@/hooks/useAppSettings"
import { MainNav } from "@/components/main-nav"
import {
LanguageMapping,
LocaleTypes,
languagesItems,
} from "@/app/i18n/settings"
import { LocaleTypes, languagesItems } from "@/app/i18n/settings"
import { Icons } from "./icons"
import { SiteHeaderMobile } from "./site-header-mobile"
@@ -19,7 +15,7 @@ type SiteHeaderProps = {
}
export function SiteHeader({ lang }: SiteHeaderProps) {
const { MAIN_NAV } = useAppSettings(lang)
const { MAIN_NAV, activeLanguageLabel } = useAppSettings(lang)
return (
<header className="sticky top-0 z-40 w-full bg-white shadow-sm">
@@ -34,7 +30,7 @@ export function SiteHeader({ lang }: SiteHeaderProps) {
<div className="flex items-center gap-1">
<Icons.globe size={22} />
<span className="!text-base !font-normal text-tuatara-950">
{LanguageMapping[lang] ?? LanguageMapping["en"]}
{activeLanguageLabel}
</span>
</div>
}

View File

@@ -1,7 +1,8 @@
export type SiteConfig = typeof siteConfig
export const siteConfig = {
showLanguageSwitcher: true, // TODO: enable when we have more languages
showLanguageSwitcher: true, // enable when we have more languages
showOnlyEnabledLanguages: true, // enable to show only enabled languages
name: "Privacy & Scaling Explorations",
description:
"Enhancing Ethereum through cryptographic research and collective experimentation.",

View File

@@ -1,9 +1,15 @@
import { MainNavProps } from "@/components/main-nav"
import { useTranslation } from "@/app/i18n/client"
import { LocaleTypes } from "@/app/i18n/settings"
import { LocaleTypes, fallbackLng, languageList } from "@/app/i18n/settings"
export function useAppSettings(lang: LocaleTypes) {
const { t } = useTranslation(lang, "common")
// get the active language label
const activeLanguage =
languageList.find((language) => language.key === lang)?.label ??
languageList.find((language) => language.key === fallbackLng)?.label
const MAIN_NAV: MainNavProps["items"] = [
{
title: t("menu.home"),
@@ -48,5 +54,6 @@ export function useAppSettings(lang: LocaleTypes) {
return {
MAIN_NAV,
activeLanguageLabel: activeLanguage,
}
}