30% offEnding soon
usePreferredLanguageLoading saved progress…

usePreferredLanguage

A preferred-language hook reports the browser's first language choice and stays current when that preference changes. Browsers expose the ordered list through navigator.languages, with navigator.language as the single-language fallback. Your hook turns those browser values into React state without assuming that browser globals exist during the first render.

Signature

function usePreferredLanguage(defaultValue?: string): string;

defaultValue is 'en-US' when omitted. It is the environment-safe value until a supporting browser becomes authoritative after mount.

Examples

// navigator.languages is ['fr-CA', 'fr', 'en']
renderHook(() => usePreferredLanguage()).result.current; // 'fr-CA'
// navigator.languages is [], navigator.language is 'de-DE'
renderHook(() => usePreferredLanguage('en-US')).result.current; // 'de-DE'

// If both browser values are unavailable:
renderHook(() => usePreferredLanguage('es-MX')).result.current; // 'es-MX'

Notes

  • Use the browser's precedence. Choose navigator.languages[0] when it is a non-empty string, then navigator.language, then defaultValue.
  • Read again on every event. Listen for the window languagechange event and read both navigator properties when it fires.
  • Keep one subscription. Rerenders must not add another listener, and unmounting must remove the exact function that was added.
  • Use the latest fallback. If defaultValue changes on rerender, the stable event handler must use that new value when browser preferences later become unavailable.
  • Stay environment-safe. Do not read browser-only values during the state initializer; use the fallback until the mount effect runs.
  • Keep the scope narrow. Do not return the full list, rewrite document.documentElement.lang, parse language tags, or persist an override.