react-i18next
Version:
Internationalization for react done right. Using the i18next i18n ecosystem.
130 lines (119 loc) • 3.7 kB
TypeScript
import type {
i18n,
ApplyTarget,
ConstrainTarget,
GetSource,
ParseKeys,
Namespace,
SelectorFn,
TypeOptions,
TOptions,
TFunction,
} from 'i18next';
import * as React from 'react';
type _DefaultNamespace = TypeOptions['defaultNS'];
type _EnableSelector = TypeOptions['enableSelector'];
type TransChild = React.ReactNode | Record<string, unknown>;
type $NoInfer<T> = [T][T extends T ? 0 : never];
export type TransProps<
Key extends ParseKeys<Ns, TOpt, KPrefix>,
Ns extends Namespace = _DefaultNamespace,
KPrefix = undefined,
TContext extends string | undefined = undefined,
TOpt extends TOptions & { context?: TContext } = { context: TContext },
E = React.HTMLProps<HTMLDivElement>,
> = E & {
children?: TransChild | readonly TransChild[];
components?: readonly React.ReactElement[] | { readonly [tagName: string]: React.ReactElement };
count?: number;
context?: TContext;
defaults?: string;
i18n?: i18n;
i18nKey?: Key | Key[];
ns?: Ns;
parent?: string | React.ComponentType<any> | null; // used in React.createElement if not null
tOptions?: TOpt;
values?: {};
shouldUnescape?: boolean;
t?: TFunction<Ns, KPrefix>;
};
export interface TransLegacy {
<
Key extends ParseKeys<Ns, TOpt, KPrefix>,
Ns extends Namespace = _DefaultNamespace,
KPrefix = undefined,
TContext extends string | undefined = undefined,
TOpt extends TOptions & { context?: TContext } = { context: TContext },
E = React.HTMLProps<HTMLDivElement>,
>(
props: TransProps<Key, Ns, KPrefix, TContext, TOpt, E>,
): React.ReactElement;
}
export interface TransSelectorProps<
Key,
Ns extends Namespace = _DefaultNamespace,
KPrefix = undefined,
TContext extends string | undefined = undefined,
TOpt extends TOptions & { context?: TContext } = { context: TContext },
> {
children?: TransChild | readonly TransChild[];
components?: readonly React.ReactElement[] | { readonly [tagName: string]: React.ReactElement };
count?: number;
context?: TContext;
defaults?: string;
i18n?: i18n;
i18nKey?: Key;
ns?: Ns;
parent?: string | React.ComponentType<any> | null; // used in React.createElement if not null
tOptions?: TOpt;
values?: {};
shouldUnescape?: boolean;
t?: TFunction<Ns, KPrefix>;
}
export interface TransSelector {
<
Target extends ConstrainTarget<TOpt>,
Key extends SelectorFn<GetSource<$NoInfer<Ns>, KPrefix>, ApplyTarget<Target, TOpt>, TOpt>,
const Ns extends Namespace = _DefaultNamespace,
KPrefix = undefined,
TContext extends string | undefined = undefined,
TOpt extends TOptions & { context?: TContext } = { context: TContext },
E = React.HTMLProps<HTMLDivElement>,
>(
props: TransSelectorProps<Key, Ns, KPrefix, TContext, TOpt> & E,
): React.ReactElement;
}
export const Trans: _EnableSelector extends true | 'optimize' ? TransSelector : TransLegacy;
export type ErrorCode =
| 'NO_I18NEXT_INSTANCE'
| 'NO_LANGUAGES'
| 'DEPRECATED_OPTION'
| 'TRANS_NULL_VALUE'
| 'TRANS_INVALID_OBJ'
| 'TRANS_INVALID_VAR'
| 'TRANS_INVALID_COMPONENTS';
export type ErrorMeta = {
code: ErrorCode;
i18nKey?: string;
[x: string]: any;
};
/**
* Use to type the logger arguments
* @example
* ```
* import type { ErrorArgs } from 'react-i18next';
*
* const logger = {
* // ....
* warn: function (...args: ErrorArgs) {
* if (args[1]?.code === 'TRANS_INVALID_OBJ') {
* const [msg, { i18nKey, ...rest }] = args;
* return log(i18nKey, msg, rest);
* }
* log(...args);
* }
* }
* i18n.use(logger).use(i18nReactPlugin).init({...});
* ```
*/
export type ErrorArgs = readonly [string, ErrorMeta | undefined, ...any[]];