扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐

这篇具有很好参考价值的文章主要介绍了扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

jQuery.i18n.properties 是 jQuery 老项目的国际化框架,其实国际化方案本质上都大同小异,都是需要用翻译函数包裹词条,然后根据词条文件来进行翻译

就是使用上与其他框架不太一样而已

但由于我们已经基于 vue 框架实现了一个国际化自动处理脚本,脚本会自动用全局函数包裹词条,自动提取到 json 文件中

因此,为了让这个老项目也能够用脚本来进行维护,又考虑到最小的改造成本和最小的影响,我们决定扩展 jQuery.i18n.properties 的能力,让它的国际化行为跟 vue-i18n 一致,也就能够用脚本来进行维护了

而且对于团队内的其他新人而言,也没必要去了解 jQuery.i18n.properties,毕竟扩展后的使用方式跟 vue-i18n 基本一样

那么扩展之前,先来看下 jQuery.i18n.properties 这个框架:

全局函数

$.i18n.properties(settings)

国际化初始化函数,用来设置当前语言,资源文件路径

$.i18n.prop(key, ...args)

国际化全局函数,根据 key 值去资源文件里找翻译,后续参数支持占位符替换

当根据 key 值找不到翻译时,会直接返回 key 值

类似 vue-i18n 的 $t

词条文件

.properties 格式文件

也是个键值对的配置文件,只是格式与 json 不一样

【en.properties】

string_login=Login
string_username=username
string_password=password

【zh.properties】

string_login=登录
string_username=账号
string_password=密码

扩展

增加支持 .json 格式的词条文件

重写 $.i18n 的全局函数,内部增加支持 json 词条的挂载,以及在原本翻译行为结束后,如果没翻译成功,则走入 json 词条里进行匹配,查看是否能翻译成功

这样能保证不改动原本项目里已有的国际化代码和行为,保持原样

新增或新改动到的代码就可以用新的方式去进行维护

所以才叫做扩展,而不是改造,毕竟扩展是以不影响原样为前提,不然谁知道老项目的屎山会由于什么修改而突然崩塌

// i18n.expand.js

/**
 * 劫持 jQuery.i18n.properties 的 api,扩展国际化能力:
 * 1. 支持 .json 格式的资源文件
 */
function init(i18n) {
  // 注意,初始化需要在 jQuery.i18n.properties.js 文件加载后才能正常劫持到 i18n 的 api
  if (!i18n) return;
  wrapFnProperties(i18n);
  wrapFnProp(i18n);
  wrapMap(i18n);
}

/**
 * 挂载新的 map 对象来存储从 .json 资源文件里读取的国际化翻译信息
 */
function wrapMap(i18n) {
  i18n.mapFromJson = i18n.mapFromJson || {};
}

/**
 * 劫持原 prop,如果原 prop 翻译失败,则再去 mapFromJson 里尝试翻译
 */
function wrapFnProp(i18n) {
  let oldFn = i18n.prop;
  i18n.prop = function (key, ...args) {
    let value = oldFn.call(i18n, key, ...args);
    // 如果原翻译行为未翻译成功,则尝试从 json 词条里去寻找翻译
    if (value === key) {
      // 这里把原 jquery.i18n.properties#prop 代码拷贝过来就行,然后把词条来源改成从json词条里寻找翻译
      value = $.i18n.mapFromJson[key];
      // ... 省略拷贝过来的代码
    }
    return value;
  };
}

/**
 * 劫持原 properties,获取国际化相关配置信息
 * 如:当前语言 language,【新增】json的国际化翻译信息
 */
function wrapFnProperties(i18n) {
  let oldFn = i18n.properties;
  i18n.properties = function (settings, ...args) {
    if (settings.jsonResource) {
      i18n.mapFromJson = settings.jsonResource;
    }
    return oldFn.call(i18n, settings, ...args);
  };
}

// 如果当前已经加载完jquery.i18n.properties.js文件,就直接扩展它的能力
if ($.i18n) {
  // 扩展 jquery.i18n.properties 的能力
  init($.i18n);
}

export default {
  init: init,
};

然后在引入 jquery.i18n.properties.js 的 html 下面增加:

<script type="text/javascript" src="/lib/jquery.i18n.properties.js"></script>
<script type="text/javascript" src="/lib/i18n.expand.js"></script>

如果你们多页应用没有基类 html 文件的话,那如果有基类 js 的话,也可以在基类 js 里去初始化
尽量只在一个地方去初始化,省得需要每个 html 里去加代码

import i18nExpand from "./i18n.expand";
if ($.i18n) {
  // 扩展 jquery.i18n.properties 的能力
  i18nExpand.init($.i18n);
}

给 Vue 挂载个全局函数 $t 指向 $.i18n.prop

我们老项目里有引入 Vue 框架,但也仅仅引入 Vue,没有引入其他全家桶系列,只用来在有新改动时,可以局部性使用 Vue 的响应式编程

而这里老项目里没必要再引入个 Vue-i18n 框架了,直接给挂载个全局函数 $t 指向原本的国际化方案的翻译函数即可

if (Vue) {
  // 给 Vue 挂载全局函数
  Vue.prototype.$t = $.i18n.prop;
}

properties 转 json 的脚本

如果嫌弃 properties 格式的文件不好维护词条,可以写个脚本来转换:

/**
 * 将 properties 文件的国际化资源文件转成 json 格式文件
 * 脚本命令挂在 package.json 文件里
 * 注:由于 properties 文件的中文经过编码,该脚本会进行解码处理,以便中文可正常显示
 */
const vfs = require("vinyl-fs");
const map = require("map-stream");
const path = require("path");
const fs = require("fs");

const ROOT_DIR = path.resolve(__dirname, "./");
const fileRules = ["**/*.+(properties)"];
const jsonFile = "properties2json.json";

function ascii2native(value) {
  var character = value.split("\\u");
  var native1 = character[0];
  for (var i = 1; i < character.length; i++) {
    var code = character[i];
    native1 += String.fromCharCode(parseInt("0x" + code.substring(0, 4)));
    if (code.length > 4) {
      native1 += code.substring(4, code.length);
    }
  }
  return native1;
}

function run() {
  console.log("================================>start");
  let zhProperties = {};
  let enProperties = {};
  let curProperties = {};
  let res = {};
  const exist = fs.existsSync(path.resolve(ROOT_DIR, jsonFile));
  if (exist) {
    res = fs.readFileSync(path.resolve(ROOT_DIR, jsonFile), "utf-8");
    res = JSON.parse(res);
  }
  vfs
    .src(fileRules.map((item) => path.resolve(ROOT_DIR, item)))
    .pipe(
      map((file, cb) => {
        console.log("开始解析 =========================>", file.path);
        let count = 0;
        if (file.path.indexOf("_zh") > -1) {
          curProperties = zhProperties;
        } else {
          curProperties = enProperties;
        }
        let fileContent = file.contents.toString();
        fileContent.split("\n").map((line) => {
          if (line.indexOf("=") > -1) {
            count++;
            line = ascii2native(line);
            const [key, ...value] = line.split("=");
            // console.log(key, value);
            curProperties[key.trim()] = value.join("=").trim();
          }
        });
        console.log("词条数量:", count);
        console.log("解析结束 =========================>", file.path);
        cb();
      })
    )
    .on("end", () => {
      console.log("================================>end");
      //   console.log(zhProperties);
      //   console.log(enProperties);
      let unTranslate = {};
      Object.keys(zhProperties).map((key) => {
        if (enProperties[key]) {
          res[zhProperties[key]] = enProperties[key];
        } else {
          unTranslate[key] = zhProperties[key].trim();
          console.log("==>翻译丢失", key, zhProperties[key].trim());
        }
      });
      fs.writeFileSync(
        path.resolve(ROOT_DIR, jsonFile),
        JSON.stringify(res, " ", 2)
      );
      // fs.writeFileSync(
      //   path.resolve(ROOT_DIR, "unTranslate.json"),
      //   JSON.stringify(unTranslate, " ", 2)
      // );
    });
}

run();

总之,老项目的国际化原则就是控制影响面,降低维护成本,包括需要考虑交给新人去维护的情况

因此,能不改动到原方案就不改动,保持原方案不变的情况下,扩展支持跟 vue 项目一致的使用方式,以便国际化自动处理脚本也能够直接用来维护老项目文章来源地址https://www.toymoban.com/news/detail-776962.html

到了这里,关于扩展 jQurey.i18n.properties 的能力来向 vue-i18n 靠齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3中使用vue-i18n实现多语言切换

    1、安装插件【注意Vue3使用9版本,Vue2用的是8版本】 2、在src在创建lang文件夹,并创建index.js、i18n.js、和 翻译的内容文件  3、写入翻译内容,举个例子:英文(en)、中文简体(zhCN)、中文繁体(zhTN) 3、编写index.js文件,导出所有翻译内容 4、编写i18n.js文件 5、在main.js中挂载

    2024年02月06日
    浏览(57)
  • Vue3+Vue-i18n+I18N ALLY+VSCODE 自动翻译多国语言

    ps: 效果图放前面,符合的往下看,不符合的出门右转,希望多多点赞评论支持。 三种语言模式,分别是中文、英文、日文 批量翻译 最后的结果 配置vue-i18n 1、下载安装 vue-i18n ,@9以上的版本。 2、创建对应文件夹 3、对应文件夹中代码如下 helper.ts setupI18n.ts useLocale.ts 4、创建全

    2024年02月09日
    浏览(57)
  • vue-i18n 实现国际化,支持切换不同语言

    需求:后台管理系统,可以实现语言切换 实现过程:用的i18n来实现的语言切换,网上能看到好多模板,根据自己的需求,修改一下即可使用,大概都是差不多的,因为涉及到后端,所以要跟后端协商一致决定去写,我的设计思路是跟着后端设计更改的,如下: 1.语言是后端接

    2024年02月12日
    浏览(43)
  • uniapp国际化npm install vue-i18n报错

    在vue2环境下,默认安装 npm install vue-i18n 的版本是 vue-i18n@9.1.9,所以报错。 用以上命令查看版本:  vue2建议5.0版本  

    2024年02月12日
    浏览(46)
  • electron+vue3全家桶+vite项目搭建【六】集成vue-i18n 国际化

    已发现 9.2.2版本的vue-i18n 如果使用cnpm安装,打包会报错,使用npm或者pnpm安装依赖没有问题 如果需要多语言支持,那么最好在项目搭建之初我们就集成好国际化 vue i18n官网 demo项目地址 关于多窗口国际化不同步更新状态的问题解决方案 1.我们现在src下面创建locals目录,里面创

    2023年04月12日
    浏览(88)
  • Vue3中,国际化插件vue-i18n使用记录,配合VSCode自动化翻译插件i18n Ally

    说明文档: vue-i18n 版本说明: vue: 3.0.0+ vue-i18n: 9.x版 src 目录下新建目录 lang ,存放 i18n 的配置。 新建目录名称: lang (语言)、 locales (语系设定)、 i18n ,这些名称都可被VSCode图标插件( vscode-icons )检测到并美化。 lang 目录下,新建 index.js 文件,引入 vue-i18n 。 语言的配置信

    2024年02月12日
    浏览(42)
  • vue2+element-ui使用vue-i18n进行国际化的多语言/国际化

    注意:vue2.0要用8版本的,使用9版本的会报错 在src目录下,创建新的文件夹,命名为i18n zh.js en.js index.js main.js 使用方式一 效果图 使用方式二 效果图 使用方式三,在 效果图 ` 注意:这种方式存在更新this.$i18n.locale的值时无法自动切换的问题,需要刷新页面才能切换语言。解

    2024年02月07日
    浏览(73)
  • vue-i18n国际化多语言与多套UI组件库使用(Element Plus、Ant Design Vue、Naive UI)

    demo源码:Vue3 UI Lang 因调研需要,需在同一个项目中集成好几种UI组件库的多语言实现,查看各种组件库的表现情况,以便选定组件库。 注意:这只在调研过程中会如此,实际开发项目中极少存在一个项目中集成多个UI组件库的情况。 本demo实际试验阿拉伯语、法语、葡萄牙语

    2024年02月08日
    浏览(53)
  • 高性能、高扩展、高稳定:解读 EasyMR 大数据组件自定义可扩展能力

    随着互联网技术的不断发展以及大数据时代的兴起,企业对于数据分析和洞察的需求日益增长。大多数企业都积累了大量的数据,需要从这些数据中快速灵活地提取有价值的信息,以便为用户提供更好的服务或者帮助企业做出更明智的决策。 然而在不同的数据场景中,企业往

    2024年02月16日
    浏览(35)
  • 记录使用注入的方式为Unity编辑器实现扩展能力

    使用场景 当前项目编辑器中不方便存放或者提交扩展代码 相同的扩展功能需要在多个项目(编辑器)中使用 项目开发中,偶尔临时需要使用一个功能,想随时使用随时卸载 设计思路 使用进程注入,将一个 c/c++ dll 注入到当前运行的unity编辑器中 使用 c/c++ dll 调用 mono 的函数接

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包