You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
29 lines
919 B
29 lines
919 B
import { useCallback, useMemo } from "react"; |
|
import { useTranslation } from "react-i18next"; |
|
|
|
// 10% chance of getting a joke title |
|
const shouldGiveJokeTitle = () => Math.floor(Math.random() * 10) === 0; |
|
|
|
export function useRandomTranslation() { |
|
const { t } = useTranslation(); |
|
const shouldJoke = useMemo(() => shouldGiveJokeTitle(), []); |
|
const seed = useMemo(() => Math.random(), []); |
|
|
|
const getRandomTranslation = useCallback( |
|
(key: string): string => { |
|
const defaultTitle = t(`${key}.default`) ?? ""; |
|
if (!shouldJoke) return defaultTitle; |
|
|
|
const keys = t(`${key}.extra`, { returnObjects: true }); |
|
if (Array.isArray(keys)) { |
|
if (keys.length === 0) return defaultTitle; |
|
return keys[Math.floor(seed * keys.length)]; |
|
} |
|
|
|
return typeof keys === "string" ? keys : defaultTitle; |
|
}, |
|
[t, seed, shouldJoke], |
|
); |
|
|
|
return { t: getRandomTranslation }; |
|
}
|
|
|