避免在 API 操作上重复代码,但仍支持多语言

Avoiding repeating code on API Actions but still supporting multi language

我的目标是创建一个支持多种语言的API。

它正在工作,但前提是我调用

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

在每个 Action 上,我认为可以避免的事情。


在 WebApiConfig.cs 文件上,我创建了一个支持多种语言的路由,将该语言放在默认路由 "{lang}/api/{controller}/{id}" 之前。这意味着对于英语,我可以调用 http://localhost/en/api/service/get,对于葡萄牙语,我可以调用 http://localhost/pt/api/service/get.

WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApiLocalized",
            routeTemplate: "{lang}/api/{controller}/{id}",
            constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})"}, // en or en-US
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

在我的行动中,我收到了语言并用它来改变文化。

ServiceController.cs

public class ServiceController : ApiController
{
    [HttpGet]
    public string Get(string lang)
    {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
        return Resources.Global.Country;
    }
}

当我调用 http://localhost/en/api/service/gethttp://localhost/pt/api/service/get 时,我得到了各自语言的字符串,运行良好。

如何避免使用

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);

所有操作?

我在哪里可以在代码中写一次,但仍然得到所需的 lang 参数?

如果您从所有操作方法中删除了一些代码并希望将其放在一个中心位置以避免代码重复,您可以考虑创建一个操作过滤器并在全局应用它,以便它适用于所有请求。

public class LangSettingActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var routeData= actionContext.Request.GetRouteData();
        object langCode;
        if (routeData.Values.TryGetValue("lang", out langCode))
        {
          //the languageCode from url is in langCode variable. Use it as needed.
          //Thread.CurrentThread.CurrentUICulture =
                                    //CultureInfo.GetCultureInfo(langCode.ToString());

        }
        base.OnActionExecuting(actionContext);
    }
}

您可以在 WebApiConfig class.

Register 方法中全局注册此过滤器
public static void Register(HttpConfiguration config)
{
   // Your existing route definiton here
   config.Filters.Add(new LangSettingActionFilter());
}