前提:我这里是通过对应的参数来判断name字段展示数据库的name /name-en/name-jp等字段,不是自动更改的
需要实现的效果
通过请求参数lang(语言)参数 ,决定字段显示(数据库设置了字段)
(简体中文(zh-cn),日语(ja),英语(en-us),繁体中文(zh-tw))
接下来是步骤
- 创建过滤器(主要是拿到lang 是什么语言参数)
using JWProject.Api.Infrastructure;
using JWProject.Common.Enums;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.OpenApi.Any;
using System.Globalization;
using System.Reflection;
namespace JWProject.Api.Infrastructure.Filters
{
public class SysFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
string methodType = context.HttpContext.Request.Method.ToString().ToUpper();
string langFieldName = "lang";
string blang = string.Empty;
if (methodType == "POST")
{
//獲得方法的參數值
IDictionary<string, object> data = context.ActionArguments;
//string blang = string.Empty;
//自動推斷出 裝用token信息的值 暫時不開啟****
foreach (KeyValuePair<string, object> kv in data)
{
var obj = kv.Value;
if (obj == null || obj.GetType().Name != typeof(BaseQuery<>).Name)
{
continue;
}
var pros = obj.GetType().GetProperties();
foreach (PropertyInfo p in pros)
{
if (p.Name == langFieldName)
{
blang = p.GetValue(obj, null) as string;
blang= blang.ToLower();//拿到参数的lang的数据强转小写
break;
}
}
}
}
else
{
//獲得方法的參數值
IDictionary<string, object> data = context.ActionArguments;
if (data.Keys.Contains(langFieldName))
{
blang = data[langFieldName] as string;
}
}
if (!string.IsNullOrWhiteSpace(blang))//如果请求参数语言不为空
{
LangType lType = LangType.FromLanguageCodes<LangType>(blang);
SetResx(lType.LanguageCode); //設置語言
}
else
{
SetResx(LangType.Chinese.LanguageCode);//否则为中文
}
}
//这个是通过参数去找到对应语言资源文件 参数lang是ja 则找到ja的资源文件
public void SetResx(string cultureQuery)
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
#region
// 这是一个用于设置当前线程的文化(Culture)的方法。在这里,cultureQuery 参数是一个表示语言和区域的字符串,例如 "en-US" 表示英语(English)和美国(United States)。
//具体来说,这个方法执行以下操作:
//创建一个 CultureInfo 对象,用于表示特定的文化和区域。
//将 CultureInfo 对象分配给 CultureInfo.CurrentCulture,这将影响当前线程的所有区域设置相关的操作。
//将 CultureInfo 对象分配给 CultureInfo.CurrentUICulture,这将影响当前线程的用户界面相关的操作。
//在ASP.NET Core中,通过设置当前线程的文化,你可以实现本地化,以便根据用户的语言和区域提供不同的资源文件。在你的例子中,它被用于在 SysFilter 中根据请求的语言参数设置当前线程的文化,以影响后续的资源文件获取。
#endregion
}
}
BaseQuery<>实体 //这个是接口请求参数,可在自己对应的文件添加 lang
/// <summary>
/// 查詢
/// </summary>
/// <typeparam name="T"></typeparam>
public class BaseQuery<T>
{
/// <summary>
/// 是否是移動端 true:是,false:不是
/// </summary>
public bool isMobile { set; get; }
/// <summary>
/// 語言
/// </summary>
public string? lang { set; get; }
/// <summary>
/// 查詢數據集
/// </summary>
public T oData { set; get; }
}
语言枚举 LangType
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JWProject.Common.Enums
{
public class LangType : Enumeration
{
/// <summary>
/// 繁體中文
/// </summary>
public static LangType TraditionalChinese = new LangType(0, "TraditionalChinese", "zh-tw", "tc");
/// <summary>
/// 簡體中文
/// </summary>
public static LangType Chinese = new LangType(1, "Chinese", "zh-cn", "sc");
/// <summary>
/// 英文
/// </summary>
public static LangType English = new LangType(2, "English", "en-us", "en");
/// <summary>
/// 日文
/// </summary>
public static LangType Japanese = new LangType(3, "Japanese", "ja", "jp");
/// <summary>
/// ISO 639-1 language codes
/// 繁體中文:zh-tw;簡體中文:zh-cn;英文:en-us;日文:ja
/// https://www.andiamo.co.uk/resources/iso-language-codes/
/// </summary>
public string LanguageCode { set; get; }
/// <summary>
/// 簡稱
/// 繁體中文:tc;簡體中文:sc;英文:en;日文:jp
/// </summary>
public string ShortName { set; get; }
public LangType(int id, string name, string languageCode, string shortName) : base(id, name)
{
LanguageCode = languageCode;
ShortName = shortName;
}
public static T FromLanguageCodes<T>(string languageCode) where T : LangType
{
var matchingItem = Parse<T, string>(languageCode, "Language Codes", item => item.LanguageCode == languageCode); ;
return matchingItem;
}
}
}
2.创建语言资源文件
App_GlobalResources文件夹
进行设置 对应的语言用来判断字段的值对应哪个语言
可以安装ResXManager工具
1.给字段赋值
//name_cn = item.ST_NAME_CN,
//name_en = item.ST_NAME_EN,
label = GetValue(lang.LangType, item.ST_NAME_CN, item.ST_LABEL, item.ST_NAME_EN, ""),
2GetValue()方法用来判断 默认是繁体
//获取Name值
public string GetValue(string type, string name,string nameTw, string nameEng, string nameJa)
{
LangType lType = LangType.FromLanguageCodes<LangType>(type);
if ( string.IsNullOrEmpty(name))
{
name = nameTw;
}
if (type == null)
{
return nameTw;
}
if (lType == LangType.Japanese)
{
return nameJa;
}
else if (lType == LangType.English)
{
return nameEng;
} else if (lType == LangType.Chinese)
{
return name;
}
else
{ return nameTw; }
}
需要在控制器接口加上过滤器的名字 [SysFilter]
最后运行项目就可以根据你选择的主题切换字段对应的语言
效果图