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

打印 上一主题 下一主题

主题 776|帖子 776|积分 2330

上篇文章我们介绍了
VUE+.NET应用系统的国际化-整体设计思路
系统国际化改造整体设计思路如下:

  • 提供一个工具,识别前后端代码中的中文,形成多语言词条,按语言、界面、模块统一管理多有的多语言词条
  • 提供一个翻译服务,批量翻译多语言词条
  • 提供一个词条服务,支持后端代码在运行时根据用户登录的语言,动态获取对应的多语言文本
  • 提供前端多语言JS生成服务,按界面动态生成对应的多语言JS文件,方便前端VUE文件使用。
  • 提供代码替换工具,将VUE前端代码中的中文替换为$t("词条ID"),后端代码中的中文替换为TermService.Current.GetText("词条ID")
今天,我们继续介绍多语言词条服务的设计和实现。
一、多语言词条设计
什么是多语言词条,即代码中需要支持多语言的文本。例如后台提示、前端界面的各类显示元素(Label、Button文字、Tooltips、标题、列表标题等等)。这些内容统一抽象为多语言词条。
多语言词条是产品多语言包的组成部分。支持在不同的语言下,显示对应的文本。

 上图中:
 I18NTerm代表多语言词条对象,主要描述了多语言词条的各个属性,主要的几个属性有:
  1.         /// <summary>
  2.         /// 词条的key
  3.         /// </summary>
  4.         public string Code { get; set; }
  5.         /// <summary>
  6.         /// 词条的名称
  7.         /// </summary>
  8.         public string Name { get; set; }
  9.         /// <summary>
  10.         /// 原始文本
  11.         /// </summary>
  12.         public string OriginalText { get; set; }
  13.         /// <summary>
  14.         /// 多语言词条子项
  15.         /// </summary>
  16.         public List<I18NTermItem> TranslateItems { get; set; } = new List<I18NTermItem>();
  17.         /// <summary>
  18.         /// 隶属的产品
  19.         /// </summary>
  20.         public string Product { get; set; }
  21.         /// <summary>
  22.         /// 隶属的关键应用/系统
  23.         /// </summary>
  24.         /// <remarks>
  25.         /// 用于批量打包国际化JS文件
  26.         /// </remarks>
  27.         public string SubSystem { get; set; }
  28.         /// <summary>
  29.         /// 隶属的关键应用/系统编号
  30.         /// </summary>
  31.         /// <remarks>
  32.         /// 用于批量打包国际化JS文件
  33.         /// </remarks>
  34.         public string SubSystemCode { get; set; }
复制代码
 一条词条,包含多个词条子项I18NTermItem,每一个词条子项,都代表了一种语言的翻译结果
  1. public class I18NTermItem : CacheElement
  2.     {
  3.         /// <summary>
  4.         /// 词条ID
  5.         /// </summary>
  6.         public string TermID { get; set; }
  7.         /// <summary>
  8.         /// 语言
  9.         /// </summary>
  10.         public string Language { get; set; }
  11.         /// <summary>
  12.         /// 翻译的文本
  13.         /// </summary>
  14.         public string TranslateText { get; set; }
  15.         /// <summary>
  16.         /// 用户自定义文本
  17.         /// </summary>
  18.         public string CustomText { get; set; }
  19.         public string GetText()
  20.         {
  21.             if (string.IsNullOrEmpty(CustomText))
  22.             {
  23.                 return TranslateText;
  24.             }
  25.             return CustomText;
  26.         }
  27.     }
复制代码
 二、多语言词条管理服务
 有了多语言词条对象后,需要增加其对应的多语言词条管理服务,用于对词条的增删查改
 先定义一个多语言词条管理的接口II18NTermManageService
  1. public interface II18NTermManageService
  2.     {
  3.         void Add(I18NTerm term);
  4.         void Remove(string termId);
  5.         void AddTerms(List<I18NTerm> terms);
  6.         void RemoveTerms(List<string> terms);
  7.         void Update(I18NTerm term);
  8.         I18NTerm GetTerm(string termId);
  9.         List<I18NTerm> GetTerms();
  10.         List<I18NTerm> GetTerms(string sourceId);
  11.         List<I18NTerm> GetTermsByApplication(string applicationId);
  12.         List<I18NTerm> GetTermByConditions(string applicationId, string sourceId = null, string sourceLocation = null, string Dimension1 = null, string Dimension2 = null, string Dimension3 = null);
  13.     }
复制代码
这个接口对应的实现中,可以采用EF完成词条数据的持久化操作,在这里不再详细展示了,大家根据需求自行实现即可。
三、多语言词条查询服务
系统在运行时,需要调用词条服务查询各类词条的翻译文本。因此,抽象一个多语言词条查询服务接口II18NTermService
  1.     /// <summary>
  2.     /// 词条查询服务接口
  3.     /// </summary>
  4.     public interface II18NTermService
  5.     {
  6.         /// <summary>
  7.         /// 根据词条编号获取对应的词条翻译
  8.         /// </summary>
  9.         /// <param name="termCode">词条编号</param>
  10.         /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
  11.         /// <returns></returns>
  12.         string GetText(string termCode, string defaultText);
  13.         /// <summary>
  14.         /// 根据词条编号获取对应的词条翻译并格式化输出
  15.         /// </summary>
  16.         /// <param name="termCode">词条编号</param>
  17.         /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
  18.         /// <param name="args">包含零个或多个要格式化的对象的对象数组</param>
  19.         /// <returns></returns>
  20.         string GetTextFormatted(string termCode, string defaultText, params object[] args);
  21.         /// <summary>
  22.         /// 根据词条编号获取对应的词条翻译
  23.         /// </summary>
  24.         /// <param name="termCode">词条编号</param>
  25.         /// <param name="language">语言标识</param>
  26.         /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
  27.         /// <returns></returns>
  28.         string GetTextWithlanguage(string termCode,string language, string defaultText);
  29.         /// <summary>
  30.         /// 根据词条编号获取对应的词条翻译并格式化输出
  31.         /// </summary>
  32.         /// <param name="termCode">词条编号</param>
  33.         /// <param name="language">语言标识</param>
  34.         /// <param name="defaultText">默认值,如果根据编号找不到词条或者词条对应的翻译将返回默认值</param>
  35.         /// <param name="args">包含零个或多个要格式化的对象的对象数组</param>
  36.         /// <returns></returns>
  37.         string GetTextFormattedWithlanguage(string termCode, string language, string defaultText, params object[] args);
  38.         /// <summary>
  39.         /// 批量获取词条,注意:此接口不能在特来电生产环境使用。
  40.         /// </summary>
  41.         /// <param name="termCodes"></param>
  42.         /// <returns></returns>
  43.         Dictionary<string,string> BatchGetText(List<string> termCodes);
  44.     }
复制代码
这个接口的具体实现中,可以增加词条的Redis缓存和内存缓存,调用II18NTermManageService的实现逻辑,从数据库中查询持久化的词条数据。缓存到内存和Redis中,  以提升查询性能。
例如:
  1. /// <summary>
  2.         /// 获取词条翻译
  3.         /// </summary>
  4.         /// <param name="termCode">词条编号</param>
  5.         /// <param name="defaultText">默认值,当找不到对应的词条时将返回默认值</param>
  6.         /// <returns></returns>
  7.         /// <exception cref="ArgumentNullException"></exception>
  8.         public string GetText(string termCode, string defaultText)
  9.         {
  10.             if (string.IsNullOrWhiteSpace(termCode))
  11.                 throw new ArgumentNullException($"Term Code is null, {termCode}");
  12.             if (Teld.Core.Session.Service.AppContext.Current.Language == null)
  13.             {
  14.                 return defaultText;
  15.             }
  16.             string language = T.Core.Session.Service.AppContext.Current.Language.DisplayCode;
  17.             string key = termCode + "&" + language;
  18.             if (cache.TryGetValue(key, out var val))
  19.             {
  20.                 return val;
  21.             }
  22.             var termItem = termManageService.GetTermItem(termCode, language);
  23.             if (termItem == null)
  24.             {
  25.                 TermMonitor.NotFound(termCode, language);
  26.                 return defaultText;
  27.             }
  28.             else
  29.             {
  30.                 string text = termItem.GetText();
  31.                 cache[key] = text;
  32.                 return text;
  33.             }
  34.         }
复制代码
以上是多语言词条服务的设计和实现。
分享给大家
 
周国庆
2023/3/11
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表