TranslateMiddleware.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using Masuit.MyBlogs.Core.Common;
  2. using Masuit.Tools;
  3. using Masuit.Tools.AspNetCore.Mime;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
  6. using System.IO;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace Masuit.MyBlogs.Core.Extensions
  10. {
  11. /// <summary>
  12. /// 简繁转换拦截器
  13. /// </summary>
  14. public class TranslateMiddleware
  15. {
  16. private readonly RequestDelegate _next;
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="next"></param>
  21. public TranslateMiddleware(RequestDelegate next)
  22. {
  23. _next = next;
  24. }
  25. public Task Invoke(HttpContext context)
  26. {
  27. var path = context.Request.Path.Value ?? "";
  28. if (path.StartsWith("/_blazor") || path.StartsWith("/api") || path.StartsWith("/file") || path.StartsWith("/download") || context.Request.IsRobot())
  29. {
  30. return _next(context);
  31. }
  32. string lang = context.Request.Query["lang"];
  33. lang ??= context.Request.Cookies["lang"];
  34. if (string.IsNullOrEmpty(lang))
  35. {
  36. if (context.Request.Location().Location.Contains(new[] { "台湾", "香港", "澳门", "Taiwan", "TW", "HongKong", "HK" }))
  37. {
  38. return Traditional(context);
  39. }
  40. return _next(context);
  41. }
  42. if (lang == "zh-cn")
  43. {
  44. return _next(context);
  45. }
  46. return Traditional(context);
  47. }
  48. private async Task Traditional(HttpContext context)
  49. {
  50. var accept = context.Request.Headers["Accept"][0];
  51. if (accept.StartsWith("text") || accept.Contains(ContentType.Json))
  52. {
  53. //设置stream存放ResponseBody
  54. var responseOriginalBody = context.Response.Body;
  55. var memStream = new MemoryStream();
  56. context.Response.Body = memStream;
  57. // 执行其他中间件
  58. await _next(context);
  59. //处理执行其他中间件后的ResponseBody
  60. memStream.Position = 0;
  61. var responseReader = new StreamReader(memStream, Encoding.UTF8);
  62. var responseBody = await responseReader.ReadToEndAsync();
  63. memStream = new MemoryStream(Encoding.UTF8.GetBytes(ChineseConverter.Convert(responseBody, ChineseConversionDirection.SimplifiedToTraditional)));
  64. await memStream.CopyToAsync(responseOriginalBody);
  65. context.Response.Body = responseOriginalBody;
  66. }
  67. else
  68. {
  69. await _next(context);
  70. }
  71. }
  72. }
  73. }