language-picker.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { For, createSignal } from "solid-js"
  2. import { useLocation, useNavigate } from "@solidjs/router"
  3. import { Dropdown, DropdownItem } from "~/component/dropdown"
  4. import { useLanguage } from "~/context/language"
  5. import { route, strip } from "~/lib/language"
  6. import "./language-picker.css"
  7. export function LanguagePicker(props: { align?: "left" | "right" } = {}) {
  8. const language = useLanguage()
  9. const navigate = useNavigate()
  10. const location = useLocation()
  11. const [open, setOpen] = createSignal(false)
  12. return (
  13. <div data-component="language-picker">
  14. <Dropdown
  15. trigger={language.label(language.locale())}
  16. align={props.align ?? "left"}
  17. open={open()}
  18. onOpenChange={setOpen}
  19. >
  20. <For each={language.locales}>
  21. {(locale) => (
  22. <DropdownItem
  23. selected={locale === language.locale()}
  24. onClick={() => {
  25. language.setLocale(locale)
  26. const href = `${route(locale, strip(location.pathname))}${location.search}${location.hash}`
  27. if (href !== `${location.pathname}${location.search}${location.hash}`) navigate(href)
  28. setOpen(false)
  29. }}
  30. >
  31. {language.label(locale)}
  32. </DropdownItem>
  33. )}
  34. </For>
  35. </Dropdown>
  36. </div>
  37. )
  38. }