39 lines
967 B
TypeScript
39 lines
967 B
TypeScript
import MESSAGES from 'soapbox/locales/messages';
|
|
|
|
import { useSettings } from './useSettings';
|
|
|
|
import type { CSSProperties } from 'react';
|
|
|
|
/** Locales which should be presented in right-to-left. */
|
|
const RTL_LOCALES = ['ar', 'ckb', 'fa', 'he'];
|
|
|
|
/** Ensure the given locale exists in our codebase */
|
|
const validLocale = (locale: string): boolean => Object.keys(MESSAGES).includes(locale);
|
|
|
|
interface UseLocaleResult {
|
|
locale: string
|
|
direction: CSSProperties['direction']
|
|
}
|
|
|
|
/** Get valid locale from settings. */
|
|
const useLocale = (fallback = 'en'): UseLocaleResult => {
|
|
const settings = useSettings();
|
|
const userLocale = settings.get('locale') as unknown;
|
|
|
|
const locale =
|
|
(typeof userLocale === 'string' && validLocale(userLocale))
|
|
? userLocale
|
|
: fallback;
|
|
|
|
const direction: CSSProperties['direction'] =
|
|
RTL_LOCALES.includes(locale)
|
|
? 'rtl'
|
|
: 'ltr';
|
|
|
|
return {
|
|
locale,
|
|
direction,
|
|
};
|
|
};
|
|
|
|
export { useLocale };
|