52 lines
1.3 KiB
TypeScript
Executable File
52 lines
1.3 KiB
TypeScript
Executable File
import {useCallback} from 'react';
|
|
import memoize from 'nano-memoize';
|
|
import {useSelectedLocale} from './selected-locale';
|
|
import {handlePluralMessage} from './handle-plural-message';
|
|
import {MessageDescriptor} from './message-descriptor';
|
|
import {shallowEqual} from '../utils/shallow-equal';
|
|
|
|
export interface UseTransReturn {
|
|
trans: (props: MessageDescriptor) => string;
|
|
}
|
|
|
|
export function useTrans(): UseTransReturn {
|
|
const {lines, localeCode} = useSelectedLocale();
|
|
const trans = useCallback(
|
|
(props: MessageDescriptor): string => {
|
|
return translate({...props, lines, localeCode});
|
|
},
|
|
[lines, localeCode],
|
|
);
|
|
|
|
return {trans};
|
|
}
|
|
|
|
interface TranslateProps extends MessageDescriptor {
|
|
lines?: Record<string, string>;
|
|
localeCode: string;
|
|
}
|
|
const translate = memoize(
|
|
(props: TranslateProps) => {
|
|
let {lines, message, values, localeCode} = props;
|
|
|
|
if (message == null) {
|
|
return '';
|
|
}
|
|
|
|
message = lines?.[message] || lines?.[message.toLowerCase()] || message;
|
|
|
|
if (!values) {
|
|
return message;
|
|
}
|
|
|
|
message = handlePluralMessage(localeCode, props);
|
|
|
|
Object.entries(values).forEach(([key, value]) => {
|
|
message = message.replace(`:${key}`, `${value}`);
|
|
});
|
|
|
|
return message;
|
|
},
|
|
{equals: shallowEqual, callTimeout: 0},
|
|
);
|