Asp.net core api 配置多语言

前提:我这里是通过对应的参数来判断name字段展示数据库的name /name-en/name-jp等字段,不是自动更改的

需要实现的效果

通过请求参数lang(语言)参数 ,决定字段显示(数据库设置了字段)

(简体中文(zh-cn),日语(ja),英语(en-us),繁体中文(zh-tw))

接下来是步骤

  1. 创建过滤器(主要是拿到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]

最后运行项目就可以根据你选择的主题切换字段对应的语言

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫.net

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值