]> Untitled Git - lemmy-ui.git/blobdiff - generate_translations.js
address review comments
[lemmy-ui.git] / generate_translations.js
index e792e6d22c062122f27a0834975b109b4eb4e6c5..594f574c3433778551159c28cc8ae5d32369ee6c 100644 (file)
@@ -1,27 +1,68 @@
-fs = require('fs');
+const fs = require("fs");
 
-let translationDir = 'translations/';
-let outDir = 'src/shared/translations/';
+const translationDir = "lemmy-translations/translations/";
+const outDir = "src/shared/translations/";
 fs.mkdirSync(outDir, { recursive: true });
-fs.readdir(translationDir, (err, files) => {
+fs.readdir(translationDir, (_err, files) => {
   files.forEach(filename => {
-    const lang = filename.split('.')[0];
+    const lang = filename.split(".")[0];
     try {
       const json = JSON.parse(
-        fs.readFileSync(translationDir + filename, 'utf8')
+        fs.readFileSync(translationDir + filename, "utf8")
       );
-      var data = `export const ${lang} = {\n  translation: {`;
-      for (var key in json) {
+      let data = `export const ${lang} = {\n  translation: {`;
+      for (const key in json) {
         if (key in json) {
           const value = json[key].replace(/"/g, '\\"');
-          data = `${data}\n    ${key}: "${value}",`;
+          data += `\n    ${key}: "${value}",`;
         }
       }
-      data += '\n  },\n};';
-      const target = outDir + lang + '.ts';
+      data += "\n  },\n};";
+      const target = outDir + lang + ".ts";
       fs.writeFileSync(target, data);
     } catch (err) {
       console.error(err);
     }
   });
 });
+
+// generate types for i18n keys
+const baseLanguage = "en";
+
+fs.readFile(`${translationDir}${baseLanguage}.json`, "utf8", (_, fileStr) => {
+  const keys = Object.keys(JSON.parse(fileStr));
+
+  const data = `import { i18n } from "i18next";
+
+declare module "i18next" {
+  export type I18nKeys = 
+${keys.map(key => `    | "${key}"`).join("\n")};
+  
+  export interface TFunctionTyped {
+    // basic usage
+    <
+      TResult extends TFunctionResult = string,
+      TInterpolationMap extends Record<string, unknown> = StringMap
+    >(
+      key: I18nKeys | I18nKeys[],
+      options?: TOptions<TInterpolationMap> | string
+    ): TResult;
+    // overloaded usage
+    <
+      TResult extends TFunctionResult = string,
+      TInterpolationMap extends Record<string, unknown> = StringMap
+    >(
+      key: I18nKeys | I18nKeys[],
+      defaultValue?: string,
+      options?: TOptions<TInterpolationMap> | string
+    ): TResult;
+  }
+
+  export interface i18nTyped extends i18n {
+    t: TFunctionTyped;
+  }
+}
+`;
+
+  fs.writeFileSync(`${outDir}i18next.d.ts`, data);
+});