UNPKG

gettext-universal

Version:
80 lines (58 loc) 2.04 kB
import config from "./config.js" import events from "./events.js" import translate from "./translate.js" import {createContext, useCallback, useContext, useMemo, useState} from "react" import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter" import {useLocales} from "expo-localization" const TranslateContext = createContext() const WithTranslate = ({children, ...restProps}) => { const locales = useLocales() const [locale, setLocale] = useState(config.getLocale()) const actualLocales = useMemo(() => { const actualLocales = [] if (locale) { actualLocales.push(locale) } for (const locale of locales) { actualLocales.push(locale.languageCode) } return actualLocales }, [locale, locales]) const contextData = useMemo(() => ({locale, locales: actualLocales}), [actualLocales]) const onChangeLocale = useCallback(({locale}) => { setLocale(locale) }, []) useEventEmitter(events, "onLocaleChange", onChangeLocale) const restPropsKeys = Object.keys(restProps) if (restPropsKeys.length > 0) { throw new Error(`Unknown props given: ${restPropsKeys.join(", ")}`) } return ( <TranslateContext.Provider value={contextData}> {children} </TranslateContext.Provider> ) } const useTranslateExpo = () => { const localeContext = useContext(TranslateContext) const locales = useLocales() const preferredLocales = useMemo(() => { let preferredLocales = [] if (localeContext?.locale) { preferredLocales.push(localeContext.locale) } if (Array.isArray(locales)) { for (const localeData of locales) { preferredLocales.push(localeData.languageCode) } } return preferredLocales }, [localeContext?.locale, locales]) const currentTranslation = useCallback((msgId, variables, args = {}) => { args.locales ||= preferredLocales return translate(msgId, variables, args) }, [preferredLocales]) return currentTranslation } export {WithTranslate} export default useTranslateExpo