Generate typescript i18n types
authorshilangyu <xmarcinmarcin@gmail.com>
Mon, 1 Mar 2021 20:00:43 +0000 (21:00 +0100)
committershilangyu <xmarcinmarcin@gmail.com>
Mon, 1 Mar 2021 20:00:43 +0000 (21:00 +0100)
generate_translations.js

index 0cab8e3603a5a9fd113363a9255cd3c25c406e68..313e80031e8c08d5c83332310fb4dfca6152feb7 100644 (file)
@@ -1,27 +1,64 @@
-fs = require('fs');
+const fs = require("fs");
 
-let translationDir = 'lemmy-translations/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) => {
   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 * as i18n from "i18next";
+
+type I18nKeys = 
+${keys.map(key => `  | "${key}"`).join("\n")};
+
+declare module "i18next" {
+  export interface TFunction {
+    // basic usage
+    <
+      TResult extends TFunctionResult = string,
+      TInterpolationMap extends object = StringMap
+    >(
+      key: I18nKeys | I18nKeys[],
+      options?: TOptions<TInterpolationMap> | string
+    ): TResult;
+    // overloaded usage
+    <
+      TResult extends TFunctionResult = string,
+      TInterpolationMap extends object = StringMap
+    >(
+      key: I18nKeys | I18nKeys[],
+      defaultValue?: string,
+      options?: TOptions<TInterpolationMap> | string
+    ): TResult;
+  }
+}
+`;
+
+  fs.writeFileSync(`${outDir}i18next.d.ts`, data);
+});