首页 > 其他分享 >VUE+.NET应用系统的国际化-多语言词条服务

VUE+.NET应用系统的国际化-多语言词条服务

时间:2023-03-11 11:45:04浏览次数:48  
标签:VUE 词条 string get +. set NET public 语言

上篇文章我们介绍了

VUE+.NET应用系统的国际化-整体设计思路

系统国际化改造整体设计思路如下:

  1. 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言、界面、模块统一管理多有的多语言词条
  2. 提供一个翻译服务,批量翻译多语言词条
  3. 提供一个词条服务,支持后端代码在运行时根据用户登录的语言,动态获取对应的多语言文本
  4. 提供前端多语言JS生成服务,按界面动态生成对应的多语言JS文件,方便前端VUE文件使用。
  5. 提供代码替换工具,将VUE前端代码中的中文替换为$t("词条ID"),后端代码中的中文替换为TermService.Current.GetText("词条ID")

今天,我们继续介绍多语言词条服务的设计和实现。

一、多语言词条设计

什么是多语言词条,即代码中需要支持多语言的文本。例如后台提示、前端界面的各类显示元素(Label、Button文字、Tooltips、标题、列表标题等等)。这些内容统一抽象为多语言词条。

多语言词条是产品多语言包的组成部分。支持在不同的语言下,显示对应的文本。

 上图中:

 I18NTerm代表多语言词条对象,主要描述了多语言词条的各个属性,主要的几个属性有:

        /// <summary>
        /// 词条的key
        /// </summary>
        public string Code { get; set; }

        /// <summary>
        /// 词条的名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 原始文本
        /// </summary>
        public string OriginalText { get; set; }

        /// <summary>
        /// 多语言词条子项
        /// </summary>
        public List<I18NTermItem> TranslateItems { get; set; } = new List<I18NTermItem>();

        /// <summary>
        /// 隶属的产品
        /// </summary>
        public string Product { get; set; }

        /// <summary>
        /// 隶属的关键应用/系统
        /// </summary>
        /// <remarks>
        /// 用于批量打包国际化JS文件
        /// </remarks>
        public string SubSystem { get; set; }

        /// <summary>
        /// 隶属的关键应用/系统编号
        /// </summary>
        /// <remarks>
        /// 用于批量打包国际化JS文件
        /// </remarks>
        public string SubSystemCode { get; set; }

 一条词条,包含多个词条子项I18NTermItem,每一个词条子项,都代表了一种语言的翻译结果

 public class I18NTermItem : CacheElement
    {
        /// <summary>
        /// 词条ID
        /// </summary>
        public string TermID { get; set; }

        /// <summary>
        /// 语言
        /// </summary>
        public string Language { get; set; }

        /// <summary>
        /// 翻译的文本
        /// </summary>
        public string TranslateText { get; set; }

        /// <summary>
        /// 用户自定义文本
        /// </summary>
        public string CustomText { get; set; }

        public string GetText()
        {
            if (string.IsNullOrEmpty(CustomText))
            {
                return TranslateText;
            }

            return CustomText;
        }
    }

 二、多语言词条管理服务

 有了多语言词条对象后,需要增加其对应的多语言词条管理服务,用于对词条的增删查改

 先定义一个多语言词条管理的接口II18NTermManageService

public interface II18NTermManageService
    {
        void Add(I18NTerm term);

        void Remove(string termId);

        void AddTerms(List<I18NTerm> terms);

        void RemoveTerms(List<string> terms);

        void Update(I18NTerm term);

        I18NTerm GetTerm(string termId);

        List<I18NTerm> GetTerms();

        List<I18NTerm> GetTerms(string sourceId);

        List<I18NTerm> GetTermsByApplication(string applicationId);

        List<I18NTerm> GetTermByConditions(string applicationId, string sourceId = null, string sourceLocation = null, string Dimension1 = null, string Dimension2 = null, string Dimension3 = null);

    }

这个接口对应的实现中,可以采用EF完成词条数据的持久化操作,在这里不再详细展示了,大家根据需求自行实现即可。

三、多语言词条查询服务

系统在运行时,需要调用词条服务查询各类词条的翻译文本。因此,抽象一个多语言词条查询服务接口II18NTermService

    /// <summary>
    /// 词条查询服务接口
    /// </summary>
    public interface II18NTermService
    {
        /// <summary>
        /// 根据词条编号获取对应的词条翻译
        /// </summary>
        /// <param name="termCode">词条编号</param>
        /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
        /// <returns></returns>
        string GetText(string termCode, string defaultText);

        /// <summary>
        /// 根据词条编号获取对应的词条翻译并格式化输出
        /// </summary>
        /// <param name="termCode">词条编号</param>
        /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
        /// <param name="args">包含零个或多个要格式化的对象的对象数组</param>
        /// <returns></returns>
        string GetTextFormatted(string termCode, string defaultText, params object[] args);

        /// <summary>
        /// 根据词条编号获取对应的词条翻译
        /// </summary>
        /// <param name="termCode">词条编号</param>
        /// <param name="language">语言标识</param>
        /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
        /// <returns></returns>
        string GetTextWithlanguage(string termCode,string language, string defaultText);

        /// <summary>
        /// 根据词条编号获取对应的词条翻译并格式化输出
        /// </summary>
        /// <param name="termCode">词条编号</param>
        /// <param name="language">语言标识</param>
        /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
        /// <param name="args">包含零个或多个要格式化的对象的对象数组</param>
        /// <returns></returns>
        string GetTextFormattedWithlanguage(string termCode, string language, string defaultText, params object[] args);

        /// <summary>
        /// 批量获取词条,注意:此接口不能在特来电生产环境使用。
        /// </summary>
        /// <param name="termCodes"></param>
        /// <returns></returns>
        Dictionary<string,string> BatchGetText(List<string> termCodes);
    }

这个接口的具体实现中,可以增加词条的Redis缓存和内存缓存,调用II18NTermManageService的实现逻辑,从数据库中查询持久化的词条数据。缓存到内存和Redis中,  以提升查询性能。

例如:

 /// <summary>
        /// 获取词条翻译
        /// </summary>
        /// <param name="termCode">词条编号</param>
        /// <param name="defaultText">默认值,当找不到对应的词条时将返回默认值</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException"></exception>
        public string GetText(string termCode, string defaultText)
        {
            if (string.IsNullOrWhiteSpace(termCode))
                throw new ArgumentNullException($"Term Code is null, {termCode}");
            if (Teld.Core.Session.Service.AppContext.Current.Language == null)
            {
                return defaultText;
            }
            string language = T.Core.Session.Service.AppContext.Current.Language.DisplayCode;

            string key = termCode + "&" + language;

            if (cache.TryGetValue(key, out var val))
            {
                return val;
            }

            var termItem = termManageService.GetTermItem(termCode, language);

            if (termItem == null)
            {
                TermMonitor.NotFound(termCode, language);
                return defaultText;
            }
            else
            {
                string text = termItem.GetText();
                cache[key] = text;
                return text;
            }
        }

以上是多语言词条服务的设计和实现。

分享给大家

 

周国庆

2023/3/11

 

标签:VUE,词条,string,get,+.,set,NET,public,语言
From: https://www.cnblogs.com/tianqing/p/17205495.html

相关文章

  • PlotNeuralNet + ChatGPT创建专业的神经网络的可视化图形
    PlotNeuralNet:可以创建任何神经网络的可视化图表,并且这个LaTeX包有Python接口,我们可以方便的调用。但是他的最大问题是需要我们手动的编写网络的结构,这是一个很麻烦的事......
  • vue中执行异步函数async和await的用法
    在开发中,可能会遇到两个或多个函数异步执行的情况,对于Vue中函数的异步函数执行做了一个小总结,如下:异步执行使用async和await完成created(){this.init()},meth......
  • [kubernetes]使用私有harbor镜像源
    前言在node上手动执行命令可以正常从harbor拉取镜像,但是用k8s不行,使用kubectldescribepodsxxx提示未授权unauthorizedtoaccessrepository。处理方法创建一个se......
  • .net 常用工具类收藏
    Masuit.Tools包含一些常用的操作类,大都是静态类,加密解密,反射操作,权重随机筛选算法,分布式短id,表达式树,linq扩展,文件压缩,多线程下载和FTP客户端,硬件信息,字符串扩展方法,日期......
  • Vue实现div可拖动组件 并可操纵盒子大小
    Vue实现div可拖动组件并可操纵盒子大小借鉴文章:https://blog.csdn.net/qq_46103732/article/details/128902192场景:在pc端项目中会碰到弹框后多个页面重叠的场景,类似......
  • vue3请求编写规范
    vue3请求编写规范使用的是模块化的组件式API界面request(请求文件夹)总文件夹中包含了对应的接口文件xxxx.ts包含了管理最底层请求的request.ts包含了......
  • vue動態產生div及v-model數據綁定
    html模板遍歷會涉及到v-model對值的綁定,這里的思路是根據數組中的下標尋找對應行數據<divclass="row"v-for="item,indexinitems"><divclass="col-3">......
  • vue+leaflet示例:地图分屏对比展示(附源码下载)
    demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。运行工具:vscode或者其他工具。配置方式:下载demo源码,vscode打开,然后顺序执行以下命令:(1)......
  • Vue————Vue v2.7.14 入口文件【二】
    前言按着我的习惯,拿到一个项目首先我会查看项目下的README.md其次查看package.json,这里也不例外看过README.md后,来看下package.json;GitHubgithubpage内容package.......
  • Vue——Vue v2.7.14 源码阅读之代码目录结构【一】
    前言这里主要说一些vue2.7.14源码的目录结构,其实这块有些目录并不重要,不过我还是想全面的描述下,详细的一些文件说明会随着源码解读来补充完善,其中描述如果有错的地方还......