如何在asp.net core中以强类型方式获取资源字符串?

2024-05-01

在下面的程序中,为了获取资源字符串,我使用 _localizer["About Title"],其中“About Title”是一个魔术字符串。如何避免使用这样的字符串?有没有强类型的方法?

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

namespace Localization.StarterWeb.Controllers
{
    [Route("api/[controller]")]
    public class AboutController : Controller
    {
        private readonly IStringLocalizer<AboutController> _localizer;

        public AboutController(IStringLocalizer<AboutController> localizer)
        {
            _localizer = localizer;
        }

        [HttpGet]
        public string Get()
        {
            return _localizer["About Title"];
        }
    }
}

  1. 使用您的翻译创建资源文件 (.resx)。例如,如果您正在本地化AboutController那会是这样的AboutController.String.resx.

  2. 在编辑资源屏幕上时,通过将访问修饰符从“无代码生成”更改为“公共”或“内部”,为资源文件启用代码生成。保存时这将创建一个.Designer.cs资源文件的类。它将包含资源文件中每个键的静态属性。不要手动修改生成的类。每次修改后都会自动重新生成.resx.

  1. 使用控制器中生成的设计器类来获取翻译后的文本(在这种情况下不需要字符串本地化程序):

     [HttpGet]
     public string Get()
     {
         return AboutController_Strings.AboutTitle;
     }
    

    这将与using static还有技巧:

     using static Localization.StarterWeb.AboutController_Strings;
    
     //(...)
    
     [HttpGet]
     public string Get()
     {
         return AboutTitle;
     }
    

    或者,您可以将其与 ASP 的本地化程序一起使用。这在特定情况下没有增加任何价值,但对于IHtmlLocalizer因为它会为您转义 html 值。

     [HttpGet]
     public string Get()
     {
         return _localizer[nameof(AboutTitle)];
     }
    

为什么这比公认的答案更好?这样您就不需要手动创建和维护所有LocalizationKeys-类似内部有多个 const 字符串的类。 (在更大的项目中,将会有数百或数千个!)生成的.Designer.cs类将包含资源文件中的所有键。而已。一点也没有少。如果您从资源填充中删除某些内容,它将从生成的代码中删除,并在使用已删除属性的任何地方在代码中产生编译错误。如果您向资源文件添加某些内容,它将在保存资源文件时自动生成一个新属性,该属性将出现在代码完成中。

这是一种更传统的方法,最初是通过 WinForms 完成的。在微软的本地化 ASP.NET Core 的文档 https://learn.microsoft.com/aspnet/core/fundamentals/localization应用程序有一个简短的解释为什么他们添加了一种新的方式使用IStringLocalizer:硬编码翻译字符串使您的工作流程更快。在需要之前无需维护额外的东西。

对于许多开发人员来说,没有默认语言 .resx 文件并简单地包装字符串文字的新工作流程可以减少本地化应用程序的开销。其他开发人员会更喜欢传统的工作流程,因为它可以更轻松地处理较长的字符串文字,并更轻松地更新本地化字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在asp.net core中以强类型方式获取资源字符串? 的相关文章

随机推荐

  • CSS @supports (::伪元素)

    我想将区域更改为最大溢出 仅在以下情况下滚动 webkit scrollbar thumb是支持的 在纯 CSS 中这可能吗 看起来 supports只检查规则 不检查选择器 您现在可以使用 supports selector https
  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • 如何将类成员函数的返回类型设置为私有结构的对象

    很抱歉这个又长又令人困惑的标题 但我想不出更好的方法来问这个问题 所以 我有一堂课 template
  • 读取 filebuf 的等效项?

    typedef struct char c 20 int i header void foo std string s std ifstream ifs s c str std ios base binary std ios base in
  • YouTube 频道名称允许的大小是多少?

    YouTube 频道名称允许的大小是多少 最小长度 最大长度 Google 帐户名称大小限制如下 https developers google com youtube faq login limits https developers g
  • NEXT JS - 应用程序通过重写呈现两次

    我正在开发一个 NEXT JS 项目 但找不到两次渲染应用程序的解决方案 Problem 添加后rewrites to next config js App被渲染两次 如果移除 则渲染一次 next config js async rewr
  • 使用 webpack 动态提供图像

    我有一个关于 webpack 和服务图像的问题 我有一个 webpack 配置 它构建了一个 React webapp 并且还提供来自特定文件夹的 jpg 文件 但是 如果我从我的网络应用程序下载新图像并将其添加到此文件夹中 会发生什么情况
  • 响应式 img/srcset/sizes:不同的 jpg 质量取决于设备像素密度?

    我正在寻找一种响应式图像策略 允许根据设备像素密度提供不同的 jpg 质量 在高分辨率的小屏幕上 我会提供低质量但高分辨率的 jpg 在低像素密度的大屏幕上 我会提供高质量的 jpg 与设备分辨率完美匹配 问题 这是否有可能 img 背景
  • XCode 8.2.1 错误 - 没有这样的模块 YouTubePlayer

    我在用https github com gilesvangruisen Swift YouTube Player https github com gilesvangruisen Swift YouTube Player 首先 我尝试从任何
  • 如何配置 Firefox 在某些链接上运行 emacsclientw?

    我有一个 Perl 脚本 它会在一堆日志文件中查找 有趣 的行 以获取一些有趣的定义 它生成一个 HTML 文件 其中包含一个表 该表的列是时间戳 文件名 行号引用和 有趣 位 我想做的是让文件名 行号成为一个实际的链接 它将在 emacs
  • Neo4j:插入 7k 节点很慢(Spring Data Neo4j / SpringRestGraphDatabase)

    我正在构建一个应用程序 我的用户可以在其中管理字典 其中一项功能是上传文件以初始化或更新词典的内容 我首先关注的结构部分是Dictionary CONTAINS gt Word 从一个空数据库 Neo4j 1 9 4 但也尝试过 2 0 0
  • 如何对多重映射中的键和值进行排序?

    建议使用任何方法对多重映射的键及其值进行排序 例如 输入 5 1 1 9 1 1 5 2 1 2 输出必须是 1 1 1 2 1 9 5 1 5 2 答案是emplace hint 伪代码如下所示 insert with hint M mm
  • 使用 \PDO::ATTR_EMULATE_PREPARES => true 时出现 Laravel 数据不匹配错误

    我们在 Php Laravel 中构建了应用程序 对于数据库我们使用 postgres sql 此外 在 postgres 之上 我们还配置了 pgBouncer 通过管理可供任何应用程序使用的空闲连接池来限制服务器端的最大连接数 现在 我
  • 了解带有位移位的右移运算符

    我很难理解右移运算符 我理解左移 假设我们没有 int n 11 which is 1011 现在如果我们左移它n lt lt 1结果是 int a n lt lt 1 so a 10110 simply add a 0 to the en
  • 在查询中使用别名导致“命令未正确结束”

    我试过这个 SELECT FROM SELECT ROW NUMBER OVER ORDER BY vernum DESC defvern DESC AS RowNumber FROM MyTable INNER JOIN AnotherT
  • 如何释放 (ana)conda 占用的磁盘空间?

    我经常使用 conda 包管理器 到目前为止 我有相当多的环境和大量下载的软件包 占用了我的 SSD 上的大量空间 释放部分空间的一个明显途径是使用以下命令 conda env export gt environment yml from
  • 通过字段名称以编程方式获取 ACF 字段键

    我需要在 WordPress 的高级自定义字段插件 ACF 中按字段名称获取字段键 该字段被分配给一个帖子 我正在帖子的循环中 我想使用字段名称以编程方式获取字段键 这样做的原因是因为我正在创建一个表单 其中字段名称 选项 将保持不变 但在
  • HttpContext 类及其线程安全

    我有一个辛格尔顿应用程序中的对象具有以下属性 private AllocationActionsCollection AllocationActions get return HttpContext Current Session Allo
  • Node.js 无限循环功能,在某些用户输入时退出

    我不太明白节点在异步和循环方面到底是如何工作的 我想在这里实现的是让控制台打印出来 Command 并等待用户的输入 但在等待时我希望它运行 一些随机函数 无休止地直到用户在终端上输入 exit 感谢所有的帮助 以及可能的解释 以便我能理解
  • 如何在asp.net core中以强类型方式获取资源字符串?

    在下面的程序中 为了获取资源字符串 我使用 localizer About Title 其中 About Title 是一个魔术字符串 如何避免使用这样的字符串 有没有强类型的方法 using Microsoft AspNetCore Mv