初识ABP vNext(6):vue+ABP实现国际化

初识ABP vNext(6):vue+ABP实现国际化

Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

上一篇介绍了ABP扩展实体,并且在前端部分新增了身份认证管理和租户管理的菜单,在实现这两个功能模块前,先来解决一下界面文字国际化的问题。

开始

国际化(简称 I18N),本地化(简称 L10N);这两者的目的都是用于让你的应用程序支持多个国家和区域的语言,它们看起来很相似,但是有一些细微的区别,本文不对此进行深入探讨,有兴趣的可以自行搜索。ABP后端支持的是本地化,而vue-element-admin支持的是国际化,使用vue-i18n实现;本文默认它两者是一回事。

前面的章节中,已经大概分析了vue+ABP国际化的实现思路。我们可以在后端实现国际化,然后vue从后端获取国际化文本,展示到界面中;另一种方式是直接在前端部分实现国际化。在前端实现就很简单,直接在vue-element-admin的src\lang\目录下配置相应的文本,然后界面使用i18n的$t()方法渲染就可以了,这个不多做介绍。本文只探讨第一种实现方式。

语言选项

首先,语言选项列表需要根据后端配置得到。

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

在后端修改支持的语言类型,这里就只支持中文和英文2种吧,其他的注释掉。

src\Xhznl.HelloAbp.HttpApi.Host\HelloAbpHttpApiHostModule.cs:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

请求abp/application-configuration接口:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

此时返回的localization.languages属性只有2个语言了,然后只需要把这个数据绑定到界面上就好了。语言切换用的是一个公共组件 src\components\LangSelect\index.vue:

<template>
  <el-dropdown
    trigger="click"
    class="international"
    @command="handleSetLanguage"
  >
    <div>
      <svg-icon class-name="international-icon" icon-class="language" />
    </div>
    <el-dropdown-menu slot="dropdown">
      <el-dropdown-item
        v-for="item in languages"
        :key="item.cultureName"
        :disabled="language === item.cultureName"
        :command="item.cultureName"
      >
        {{ item.displayName }}
      </el-dropdown-item>
    </el-dropdown-menu>
  </el-dropdown>
</template>

<script>
export default {
  data() {
    return {
      languages: this.$store.getters.abpConfig.localization.languages
    };
  },
  computed: {
    language() {
      return this.$store.getters.language;
    }
  },
  methods: {
    handleSetLanguage(lang) {
      //this.$i18n.locale = lang
      this.$store.dispatch("app/setLanguage", lang);
      this.$store.dispatch("app/applicationConfiguration").then(() => {
        this.$message({
          message: "Switch Language Success",
          type: "success"
        });
      });
    }
  }
};
</script>

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

语言切换

语言切换时,需要再次调用app/applicationConfiguration接口,更新本地化文本。

src\utils\request.js:

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    config.headers['accept-language'] = store.getters.language

    if (store.getters.token) {
      config.headers['authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

src\store\modules\app.js:

const actions = {
  。。。。。。
    
  applicationConfiguration({ commit }) {
    return new Promise((resolve, reject) => {
      applicationConfiguration()
        .then(response => {
          const data = response;
          commit("SET_ABPCONFIG", data);

          const language = data.localization.currentCulture.cultureName;
          const values = data.localization.values;
          setLocale(language, values);

          resolve(data);
        })
        .catch(error => {
          reject(error);
        });
    });
  }
};

src\lang\index.js:

import Vue from "vue";
import VueI18n from "vue-i18n";
import Cookies from "js-cookie";
import elementEnLocale from "element-ui/lib/locale/lang/en"; // element-ui lang
import elementZhLocale from "element-ui/lib/locale/lang/zh-CN"; // element-ui lang

Vue.use(VueI18n);

const messages = {
  en: {
    ...elementEnLocale
  },
  "zh-Hans": {
    ...elementZhLocale
  }
};

export function getLanguage() {
  const chooseLanguage = Cookies.get("language");
  if (chooseLanguage) return chooseLanguage;

  // if has not choose language
  const language = (
    navigator.language || navigator.browserLanguage
  ).toLowerCase();
  const locales = Object.keys(messages);
  for (const locale of locales) {
    if (language.indexOf(locale) > -1) {
      return locale;
    }
  }
  return "en";
}
export function setLocale(language, values) {
  i18n.mergeLocaleMessage(language, values);
  i18n.locale = language;
}
const i18n = new VueI18n({
  // set locale
  // options: en | zh | es
  locale: getLanguage(),
  // set locale messages
  messages
});

export default i18n;

将后端返回的文本设置到vue-i18n中,就可以使用了。这跟直接在前端做国际化有一点区别就是,后者的文本信息是写在前端,vue-i18n可以直接使用。而这里只是把文本信息改到后端,从后端获取后再设置到i18n中,本质是一样的。

修改后端的配置文本:

src\Xhznl.HelloAbp.Domain.Shared\Localization\HelloAbp\zh-Hans.json:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

src\Xhznl.HelloAbp.Domain.Shared\Localization\HelloAbp\en.json:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

localization.values返回:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

接下来只需要把界面上对应的文本使用vue-i18n的$t()方法渲染就好了,比如:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

前端需要改动的地方比较多,但都是类似的修改。。。直接看效果:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

注意

因为app/applicationConfiguration接口只有在刷新页面、登录、退出、切换语言等操作的时候才会去调用,所以不用担心请求频繁。

其实上面有一部分本地化文本还是放在了前端:ElementUI自带的文本。因为ABP的本地化json格式只能有一级,key/value:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

文本只能写在texts属性中,key/value形式,不支持多层级。

而vue-i18n是支持多层级的:

<span>初识ABP vNext(6):vue+ABP实现国际化</span>

所以ElementUI的这部分文本还是放在前端了。

最后

本篇关于vue+ABP实现国际化就介绍完了。。。其实还是有点繁琐的,要配置的比较多,不知道有没有更好的方法,欢迎评论交流。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2641.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • app软件开发的基本流程_app项目开发流程

    app软件开发的基本流程_app项目开发流程 本文转载自互联网,如有侵权,请联系我及时删除。谢谢。(一)项目启动前  从事产品的工作一年多,但自己一直苦于这样或者那样的困惑,很多人想要从事产品,或者老板自己创业要亲自承担产品一职,但他们对产品这个岗位的认识却不明晰,有的以为是纯粹的画原型,有的是以为做项目管理跟踪项目进度,有的是做竞品分析给老板看。实际上,这些都不是产品经理的核心和重点。在较为成熟的企业,因为产品的壮大和人员的增多,…

    2022年10月30日
  • 亿图永久激活码-激活码分享

    (亿图永久激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0BXA05X8YC-eyJsaWNlbnNlSW…

    2022年3月30日
  • 启动计算机 gho文件,u盘里只有gho文件怎么重装win7系统图解

    启动计算机 gho文件,u盘里只有gho文件怎么重装win7系统图解u盘里只有gho文件怎么重装win7系统图解,windows7系统现在还是主流系统,有朋友的windows7系统出现问题了,现在u盘里只有gho文件怎么重装win7系统,这是他们遇到u盘怎么重装win7系统的问题了,那么就让小编分享一个u盘里只有gho文件怎么重装win7系统图解给大家吧。u盘里只有gho文件怎么重装win7系统步骤:工具/原料WIN7GHOST系统镜像(可以从网上下载)大于2G…

    2022年7月12日
  • windows关闭135,139端口_危险端口有哪些

    windows关闭135,139端口_危险端口有哪些我用nmap扫描自己的主机,发现自己的某些端口开启着的,我去了解了一下139端口这个端口比较危险139端口是NetBIOSSession端口,用来文件和打印共享如果你是单机,不是企业内部网里的成员,为了保护计算机的安全关闭这个端口比较好。下面是步骤1开始键输入控制面板点击进入控制面板然后点击进入网络和internet2点击进入网络和共享中心点击进入更改适配器设置在…

    2022年10月17日
  • 虚拟存储技术「建议收藏」

    虚拟存储技术「建议收藏」一.实现内存扩充的技术:(1)覆盖技术:在程序运行中,在不同时刻把同一个存储区分配给不同程序段和数据段,实现存储区共享。适用于连续存储(单一连续区分配,分区)如图BDG共享一个存储区(三个进程不同时发生),CEFH同理(2)交换技术(对换技术):1.定义:将内存中某进程的的程序和数据(全部或部分)写入外存的交换区,从而腾出内存空间给其他进程使用。2.相关涉及知识

    2022年9月26日
  • dos命令进入文件夹[通俗易懂]

    输入D:回车,进入D盘的根目录,然后输入dir回车可以查看根目录下的文件和文件夹,输入cd空格文件夹的名字(不区分大小写)进入文件夹根目录下,依次输入dir查看该目录下的文件和文件夹。   附录:MSDOS命令大全一、基础命令1dir无参数:查看当前所在目录的文件和文件夹。/s:查看当前目录已经其所有子目录的文件和文件夹。

    2022年4月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号