Skip to content

Commit 8eb2250

Browse files
committed
i18n: Support enforcing variables object conditionality
1 parent 69c39ff commit 8eb2250

2 files changed

Lines changed: 11 additions & 9 deletions

File tree

src/i18n/types.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ type InferVariables<T extends string> = T extends `${infer Prefix}{{${infer Vari
3838
? InferVariables<Prefix> | Variable | InferVariables<Suffix>
3939
: never;
4040
export type BaseLookup = Exclude<keyof RefTextMap, number | symbol>;
41-
export type VariablesFromLookup<Lookup extends BaseLookup> = InferVariables<RefTextMap[Lookup]>;
42-
43-
export type TranslationFn = <Lookup extends BaseLookup>(
44-
lookup: Lookup,
45-
variables?: Record<VariablesFromLookup<Lookup>, string | number | undefined>
46-
) => TranslatedText;
41+
export type VariablesFromLookup<Lookup extends BaseLookup> =
42+
InferVariables<RefTextMap[Lookup]> extends `${infer Variables}`
43+
? [Variables] extends [never]
44+
? []
45+
: [Record<Variables, string | number | undefined>]
46+
: [];
47+
48+
export type TranslationFn = <Lookup extends BaseLookup>(lookup: Lookup, ...variables: VariablesFromLookup<Lookup>) => TranslatedText;
4749

4850
type ReplaceStringWithTranslatedText<TParams extends readonly unknown[]> = {
4951
[K in keyof TParams]: TParams[K] extends string ? TranslatedText : TParams[K];

src/ps/games/game.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ export class BaseGame<State extends BaseState> {
118118
applyMod?(mod: string): ActionResponse<TranslatedText>;
119119
canBroadcastFinish?(): boolean;
120120

121-
throw<Lookup extends BaseLookup>(msg?: Lookup, vars?: Record<VariablesFromLookup<Lookup>, string | number | undefined>): never {
122-
if (!msg) throw new ChatError(this.$T('GAME.INVALID_INPUT'));
123-
throw new ChatError(this.$T(msg, vars));
121+
throw<Lookup extends BaseLookup>(...params: [Lookup, ...VariablesFromLookup<NonNullable<Lookup>>] | []): never {
122+
if (params.length === 0) throw new ChatError(this.$T('GAME.INVALID_INPUT'));
123+
throw new ChatError(this.$T(...(params as [Lookup, ...VariablesFromLookup<Lookup>])));
124124
}
125125

126126
constructor(ctx: BaseContext) {

0 commit comments

Comments
 (0)