前端实战-根据JSON文件自动生成对应的interface

简介: 前端实战-根据JSON文件自动生成对应的interface

用到的工具

quicktype

step1:根据JSON文件自动生成对应的interface

比如下面有个json文件(string.json):

// string.json
{
    "strings":{
        "login": {
            "zh_CN": "登录",
            "en_US": "Login in"
        },
        "login_out": {
            "zh_CN": "退出",
            "en_US": "Login out"
        },
    }
}
复制代码

想让它自动生成以下的interface,并将其自动保存在strings.interface.ts文件里:

export interface StringsInterface {
    strings: { 
        login: String,
        login_out: String
    };
}
export interface String {
    zh_CN?:       string;
    en_US?:       string;
}
复制代码

可以在终端执行命令:

quicktype ./strings.json -o ./strings.interface.ts
复制代码

此时会发现生成的interface是这样的:

export interface StringsInterface {
    strings: { [key: string]: String };
}
export interface String {
    zh_CN?:       string;
    en_US?:       string;
}
复制代码

需要修正一下strings.interface.ts,解决方法:

step1: 新建fix_strings_interface.js

const fs = require("fs");
const stringInterfacePath = "/strings.interface.ts";
const stringJSONPath = "/strings.auto.json";
const jsonStr = fs.readFileSync(stringJSONPath);
const stringsObj = JSON.parse(jsonStr);
const tmpStart = `
export interface StringsInterface {
  strings: {
`;
const tmpEnd = `
  };
}
`;
const testRegx = /^\w+$/i;
const tmpBody = Object.keys(stringsObj.strings)
  .filter((item) => {
    if (testRegx.test(item)) {
      return true;
    } else {
      console.warn(`不合法的 key:${item}`);
      return false;
    }
  })
  .map((item) => `    ${item}: String;`)
  .join("\n");
const tmp = tmpStart + tmpBody + tmpEnd;
const splitText = `export interface String {`;
const interfaceStr = fs.readFileSync(stringInterfacePath).toString();
const [_, rest] = interfaceStr.split(splitText);
const newInterfaceStr = [tmp, splitText, rest].join("\n");
fs.writeFileSync(stringInterfacePath, newInterfaceStr);
复制代码

step2:在终端执行命令:

quicktype ./strings.auto.json -o ./i18n/strings.interface.ts --just-types && node ./fix_strings_interface.js
复制代码

step2:编写方法——识别复数,并修改转化字符串

export function plural(str: string, revert: boolean) {
    const plural = {
      '(quiz)$'               : '$1zes',
      '^(ox)$'                : '$1en',
      '([m|l])ouse$'          : '$1ice',
      '(matr|vert|ind)ix|ex$' : '$1ices',
      '(x|ch|ss|sh)$'         : '$1es',
      '([^aeiouy]|qu)y$'      : '$1ies',
      '(hive)$'               : '$1s',
      '(?:([^f])fe|([lr])f)$' : '$1$2ves',
      '(shea|lea|loa|thie)f$' : '$1ves',
      sis$                  : 'ses',
      '([ti])um$'             : '$1a',
      '(tomat|potat|ech|her|vet)o$': '$1oes',
      '(bu)s$'                : '$1ses',
      '(alias)$'              : '$1es',
      '(octop)us$'            : '$1i',
      '(ax|test)is$'          : '$1es',
      '(us)$'                 : '$1es',
      '([^s]+)$'              : '$1s',
    };
    const singular = {
      '(quiz)zes$'             : '$1',
      '(matr)ices$'            : '$1ix',
      '(vert|ind)ices$'        : '$1ex',
      '^(ox)en$'               : '$1',
      '(alias)es$'             : '$1',
      '(octop|vir)i$'          : '$1us',
      '(cris|ax|test)es$'      : '$1is',
      '(shoe)s$'               : '$1',
      '(o)es$'                 : '$1',
      '(bus)es$'               : '$1',
      '([m|l])ice$'            : '$1ouse',
      '(x|ch|ss|sh)es$'        : '$1',
      '(m)ovies$'              : '$1ovie',
      '(s)eries$'              : '$1eries',
      '([^aeiouy]|qu)ies$'     : '$1y',
      '([lr])ves$'             : '$1f',
      '(tive)s$'               : '$1',
      '(hive)s$'               : '$1',
      '(li|wi|kni)ves$'        : '$1fe',
      '(shea|loa|lea|thie)ves$': '$1f',
      '(^analy)ses$'           : '$1sis',
      '((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$': '$1$2sis',
      '([ti])a$'               : '$1um',
      '(n)ews$'                : '$1ews',
      '(h|bl)ouses$'           : '$1ouse',
      '(corpse)s$'             : '$1',
      '(us)es$'                : '$1',
      s$                     : '',
    };
    const irregular = {
      move   : 'moves',
      foot   : 'feet',
      goose  : 'geese',
      sex    : 'sexes',
      child  : 'children',
      man    : 'men',
      tooth  : 'teeth',
      person : 'people',
    };
    const uncountable = [
      'sheep',
      'fish',
      'deer',
      'moose',
      'series',
      'species',
      'money',
      'rice',
      'information',
      'equipment',
    ];
    // save some time in the case that singular and plural are the same
    if (uncountable.indexOf(str.toLowerCase()) >= 0) {
      return str;
    }
    // check for irregular forms
    for (const word in irregular) {
      let pattern;
      let replace;
      if (revert) {
        pattern = new RegExp(irregular[word] + '$', 'i');
        replace = word;
      } else {pattern = new RegExp(word + '$', 'i');
        replace = irregular[word];
      }
      if (pattern.test(str)) {
        return str.replace(pattern, replace);
      }
    }
    let array;
    if (revert) {
      array = singular;
    } else {
      array = plural;
    }
    // check for matches using regular expressions
    for (const reg in array) {
      const pattern = new RegExp(reg, 'i');
      if (pattern.test(str)) {
        return str.replace(pattern, array[reg]);
      }
    }
    return str;
  }
复制代码

step3:编写多语言配置调用方法

import { StringsInterface, String as StringInterface } from './strings.interface';
import { template } from 'lodash';
import stringsConfigJson from '../config/strings.auto.json';
import { plural } from './plural';
export type { String as StringInterface } from './strings.interface';
export const ERROR_STR = '[ERROR STR]';
export const StringsConfig: StringsInterface = stringsConfigJson as any as StringsInterface;
export const Strings = StringsConfig.strings; // 字符串的key集合传出去
export function getLanguage() {
  ...
}
/**
 * 多语言获取,传入对象或key
 * @param StringObject 对应strings.json文件的字符串对象
 * @param options JavaScript Object,  支持字符串格式化(string format),支持lodash _.tempalte
 * @example t(Strings.early_bird) 或 t('early_bird')
 */
function getText(stringObj: StringInterface | string, options: any = null, isPlural: boolean = false): string {
  if(!stringObj){
    console.error('Cannot find this string key');
    return ERROR_STR;
  }
  const lang = getLanguage(); // default Language
  let obj: StringInterface;
  if (typeof stringObj === 'string' || stringObj instanceof String) {
      const key: string = stringObj as string;
    obj = StringsConfig[key];
    if (obj === undefined) {
      return key;
    }
  }
  obj = stringObj as StringInterface;
  const text = lang in obj ? obj[lang] : obj['zh_CN'] || ERROR_STR;
  const str = options ? template(text)(options) : text;
  if (isPlural) {
    return plural(str, false);
  }
  return str;
}



相关文章
|
1月前
|
存储 前端开发 JavaScript
前端状态管理:Vuex 核心概念与实战
Vuex 是 Vue.js 应用程序的状态管理模式和库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本教程将深入讲解 Vuex 的核心概念,如 State、Getter、Mutation 和 Action,并通过实战案例帮助开发者掌握在项目中有效使用 Vuex 的技巧。
|
2月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
59 4
|
2月前
|
Web App开发 缓存 监控
前端性能优化实战:从代码到部署的全面策略
前端性能优化实战:从代码到部署的全面策略
40 1
|
2月前
|
Web App开发 前端开发 JavaScript
前端性能优化实战:从代码到部署的全面指南
前端性能优化实战:从代码到部署的全面指南
43 1
|
2月前
|
缓存 前端开发 搜索推荐
前端性能优化实战:提升网页加载速度
前端性能优化实战:提升网页加载速度
|
2月前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
83 2
|
2月前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
56 2
|
3月前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
3月前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
36 1
|
2月前
|
缓存 监控 前端开发
前端性能优化实战:从加载速度到用户体验
前端性能优化实战:从加载速度到用户体验

热门文章

最新文章

下一篇
开通oss服务