X-Git-Url: http://these/git/?a=blobdiff_plain;f=generate_translations.js;h=ac3e987521bdc7a5da613184f23be5275eccb444;hb=214eae5be57f87afe1905c7fc97a7d03df8dfd5b;hp=313e80031e8c08d5c83332310fb4dfca6152feb7;hpb=19c0223b79d6dbb50afbd19d1779fe35b077ceb2;p=lemmy-ui.git diff --git a/generate_translations.js b/generate_translations.js index 313e800..ac3e987 100644 --- a/generate_translations.js +++ b/generate_translations.js @@ -30,33 +30,77 @@ fs.readdir(translationDir, (_err, files) => { const baseLanguage = "en"; fs.readFile(`${translationDir}${baseLanguage}.json`, "utf8", (_, fileStr) => { - const keys = Object.keys(JSON.parse(fileStr)); + const noOptionKeys = []; + const optionKeys = []; + const optionRegex = /\{\{(.+?)\}\}/g; + const optionMap = new Map(); - const data = `import * as i18n from "i18next"; + for (const [key, val] of Object.entries(JSON.parse(fileStr))) { + const options = []; + for ( + let match = optionRegex.exec(val); + match; + match = optionRegex.exec(val) + ) { + options.push(match[1]); + } + + if (options.length > 0) { + optionMap.set(key, options); + optionKeys.push(key); + } else { + noOptionKeys.push(key); + } + } -type I18nKeys = -${keys.map(key => ` | "${key}"`).join("\n")}; + const indent = " "; + + const data = `import { i18n } from "i18next"; declare module "i18next" { - export interface TFunction { - // basic usage + export type NoOptionI18nKeys = +${noOptionKeys.map(key => `${indent}| "${key}"`).join("\n")}; + + export type OptionI18nKeys = +${optionKeys.map(key => `${indent}| "${key}"`).join("\n")}; + + export type I18nKeys = NoOptionI18nKeys | OptionI18nKeys; + + export type TTypedOptions =${Array.from( + optionMap.entries() + ).reduce( + (acc, [key, options]) => + `${acc} TKey extends \"${key}\" ? ${ + options.reduce((acc, cur) => acc + `${cur}: string | number; `, "{ ") + + "}" + } :\n${indent}`, + "" + )} (Record | string); + + export interface TFunctionTyped { + // Translation requires options < + TKey extends OptionI18nKeys | OptionI18nKeys[], TResult extends TFunctionResult = string, - TInterpolationMap extends object = StringMap - >( - key: I18nKeys | I18nKeys[], - options?: TOptions | string + TInterpolationMap extends TTypedOptions = StringMap + > ( + key: TKey, + options: TOptions | string ): TResult; - // overloaded usage + + // Translation does not require options < TResult extends TFunctionResult = string, - TInterpolationMap extends object = StringMap - >( - key: I18nKeys | I18nKeys[], - defaultValue?: string, + TInterpolationMap extends Record = StringMap + > ( + key: NoOptionI18nKeys | NoOptionI18nKeys[], options?: TOptions | string ): TResult; } + + export interface i18nTyped extends i18n { + t: TFunctionTyped; + } } `;