自助建站系统建的网站做排名吗/seo型网站
本文内容
- 资源文件
- 注册本地化服务
- 使用 IStringLocalizer<T> 和 IStringLocalizerFactory
- 将其放在一起
本地化是针对应用支持的每个区域性,将应用资源转换为本地化版本的过程。 只有在完成本地化评审步骤,以验证全球化应用是否做好本地化准备后,才应继续执行本地化步骤。
可以开始进行本地化的应用程序分为两个概念块:一个是包含所有用户界面元素的块,另一个是包含可执行代码的块。 用户界面块仅包含可本地化的用户界面元素,如字符串、错误消息、对话框、菜单、嵌入的对象资源等区域性中性元素。 代码块仅包含所有支持的区域性要使用的应用代码。 公共语言运行时支持附属程序集资源模型,用于将应用的可执行代码与资源分隔开来。
对于应用的每个本地化版本,请添加新的附属程序集,其中包含转换为目标区域性的相应语言的本地化用户界面块。 所有区域性的代码块应保持不变。 用户界面块的本地化版本和代码块组合生成了应用的本地化版本。
在本文中,你将了解如何使用 IStringLocalizer<T> 和 IStringLocalizerFactory 实现。 本文中的所有示例源代码都依赖于 Microsoft.Extensions.Localization 和 Microsoft.Extensions.Hosting NuGet 包。
1、资源文件
隔离可本地化字符串的主要机制是使用资源文件。 资源文件是具有 .resx 文件扩展名的 XML 文件。 资源文件在执行使用应用程序之前被转换,换句话说,它们表示静态的已转换内容。 资源文件名通常包含区域设置标识符,并采用以下格式:
<FullTypeName><.Locale>.resx
其中:
<FullTypeName>
表示特定类型的可本地化资源。- 可选
<.Locale>
表示资源文件内容的区域设置。
1.1 指定区域设置
区域设置至少应该定义语言,但也可以定义区域性(区域语言),甚至是国家或地区。 这些段通常由 -
字符分隔。 通过添加区域性特异性,在为最佳匹配项设置优先级的地方应用“区域性回退”规则。 区域设置应该映射到已知语言标记。
1.2 区域性回退场景
假设你的本地化应用支持不同的塞尔维亚区域设置,并且其 MessageService
具有以下资源文件:
文件 | 区域语言 | 国家/地区代码 |
---|---|---|
MessageService.sr-Cyrl-RS.resx | (西里尔语,塞尔维亚) | RS |
MessageService.sr-Cyrl.resx | 西里尔语 | |
MessageService.sr-Latn-BA.resx | (拉丁语,波斯尼亚和黑塞哥维那) | BA |
MessageService.sr-Latn-ME.resx | (拉丁语,黑山共和国) | ME |
MessageService.sr-Latn-RS.resx | (拉丁语,塞尔维亚) | RS |
MessageService.sr-Latn.resx | 拉丁语 | |
MessageService.sr.resx | † 拉丁语 | |
MessageService.resx |
†语言的默认区域语言。
当应用运行时,将 CultureInfo.CurrentCulture 设置为 "sr-Cyrl-RS"
本地化的区域性,尝试按以下顺序解析文件:
- MessageService.sr-Cyrl-RS.resx
- MessageService.sr-Cyrl.resx
- MessageService.sr.resx
- MessageService.resx
但是,如果应用运行时,将 CultureInfo.CurrentCulture 设置为 "sr-Latn-BA"
本地化的区域性,则尝试按以下顺序解析文件:
- MessageService.sr-Latn-BA.resx
- MessageService.sr-Latn.resx
- MessageService.sr.resx
- MessageService.resx
如果没有相应的匹配项,“区域性回退”规则将忽略区域设置,这意味着如果找不到匹配项,则选择资源文件编号 4。 如果区域性设置为 "fr-FR"
,本地化最终会落到 MessageService.resx 文件,这会造成问题。
1.3 资源查找
资源文件会在查找例程中自动解析。 如果项目文件名不同于项目的根命名空间,则程序集名称可能不同。 这可能会阻止资源查找成功。 要解决这种不匹配问题,请使用 RootNamespaceAttribute 向本地化服务提供提示。 提供以后,它将在资源查找期间使用。
示例项目名为 example.csproj,它会创建 example.dll 和 example.exe ,但是会使用 Localization.Example
命名空间。 应用 assembly
级别属性来更正这种不匹配问题:
[assembly: RootNamespace("Localization.Example")]
2、注册本地化服务
要注册本地化服务,请在服务配置期间调用其中一个 AddLocalization 扩展方法。 这将启用以下类型的依赖关系注入 (DI):
- Microsoft.Extensions.Localization.IStringLocalizer<T>
- Microsoft.Extensions.Localization.IStringLocalizerFactory
2.1 配置本地化选项
AddLocalization(IServiceCollection, Action<LocalizationOptions>) 重载接受类型为 Action<LocalizationOptions>
的 setupAction
参数。 这使你可以配置本地化选项。
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);builder.Services.AddLocalization(options =>
{options.ResourcesPath = "Resources";
});// Omitted for brevity.
资源文件可以存在于项目中的任何位置,但是有些常见做法已经被证明是成功的。 通常情况下,会选择阻力最小的路径。 上述 C# 代码:
- 创建默认主机应用生成器。
- 对服务集合调用
AddLocalization
,并将 LocalizationOptions.ResourcesPath 指定为"Resources"
。
这会使本地化服务在“Resources”目录中查找资源文件。
3、使用 IStringLocalizer<T>
和 IStringLocalizerFactory
在注册(并选择性配置)本地化服务后,可以将以下类型和 DI 结合使用:
- IStringLocalizer<T>
- IStringLocalizerFactory
要创建能够返回本地化字符串的消息服务,请考虑使用以下 MessageService
:
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.Localization;namespace Localization.Example;public sealed class MessageService
{private readonly IStringLocalizer<MessageService> _localizer = null!;public MessageService(IStringLocalizer<MessageService> localizer) =>_localizer = localizer;[return: NotNullIfNotNull(nameof(_localizer))]public string? GetGreetingMessage(){LocalizedString localizedString = _localizer["GreetingMessage"];return localizedString;}
}
在前述 C# 代码中:
- 声明
IStringLocalizer<MessageService> _localizer
字段。 - 构造函数采用
IStringLocalizer<MessageService>
参数并将其分配给_localizer
字段。 GetGreetingMessage
方法调用 IStringLocalizer.Item[String],将"GreetingMessage"
作为参数传递。
IStringLocalizer
还支持参数化字符串资源,请考虑使用以下 ParameterizedMessageService
:
using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.Localization;namespace Localization.Example;public class ParameterizedMessageService
{private readonly IStringLocalizer _localizer = null!;public ParameterizedMessageService(IStringLocalizerFactory factory) =>_localizer = factory.Create(typeof(ParameterizedMessageService));[return: NotNullIfNotNull(nameof(_localizer))]public string? GetFormattedMessage(DateTime dateTime, double dinnerPrice){LocalizedString localizedString = _localizer["DinnerPriceFormat", dateTime, dinnerPrice];return localizedString;}
}
在前述 C# 代码中:
- 声明
IStringLocalizer _localizer
字段。 - 构造函数采用
IStringLocalizerFactory
参数,该参数用于从ParameterizedMessageService
类型创建IStringLocalizer
,并将其分配给_localizer
字段。 GetFormattedMessage
方法调用 IStringLocalizer.Item[String, Object[]],将"DinnerPriceFormat"
(一种dateTime
对象)和dinnerPrice
作为参数传递。
重要
IStringLocalizerFactory
不是必需的。 而使用服务最好要求使用 IStringLocalizer<T>。
两个 IStringLocalizer.Item[] 索引器都返回 LocalizedString,它们具有向 string?
的隐式转换。
4、将其放在一起
若要举例说明使用两种消息服务以及本地化和资源文件的应用,请考虑使用以下 Program.cs 文件:
using System.Globalization;
using Localization.Example;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using static System.Console;
using static System.Text.Encoding;[assembly: RootNamespace("Localization.Example")]OutputEncoding = Unicode;if (args is { Length: 1 })
{CultureInfo.CurrentCulture =CultureInfo.CurrentUICulture =CultureInfo.GetCultureInfo(args[0]);
}HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);builder.Services.AddLocalization();
builder.Services.AddTransient<MessageService>();
builder.Services.AddTransient<ParameterizedMessageService>();
builder.Logging.SetMinimumLevel(LogLevel.Warning);using IHost host = builder.Build();IServiceProvider services = host.Services;ILogger logger =services.GetRequiredService<ILoggerFactory>().CreateLogger("Localization.Example");MessageService messageService =services.GetRequiredService<MessageService>();
logger.LogWarning("{Msg}",messageService.GetGreetingMessage());ParameterizedMessageService parameterizedMessageService =services.GetRequiredService<ParameterizedMessageService>();
logger.LogWarning("{Msg}",parameterizedMessageService.GetFormattedMessage(DateTime.Today.AddDays(-3), 37.63));await host.RunAsync();
在前述 C# 代码中:
- RootNamespaceAttribute 将
"Localization.Example"
设置为根命名空间。 - Console.OutputEncoding 分配给 Encoding.Unicode。
- 单个参数传递给
args
时,CultureInfo.CurrentCulture 和 CultureInfo.CurrentUICulture 分配有arg[0]
给定的 CultureInfo.GetCultureInfo(String) 的结果。 - Host 使用默认值创建。
- 本地化服务
MessageService
和ParameterizedMessageService
注册到 DI 的IServiceCollection
。 - 为了消除干扰,日志记录被配置为忽略低于警告的任何日志级别。
MessageService
是从IServiceProvider
实例解析的,其生成的消息被记录。ParameterizedMessageService
是从IServiceProvider
实例解析的,其生成的已设置格式的消息被记录。
每个 *MessageService
类都定义一组 .resx 文件,其中每个文件都有一个条目。 下面是 MessageService
资源文件的示例内容,从 MessageService.resx 开始:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="GreetingMessage" xml:space="preserve"><value>Hi friends, the ".NET" developer community is excited to see you here!</value></data>
</root>
MessageService.sr-Cyrl-RS.resx:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="GreetingMessage" xml:space="preserve"><value>Здраво пријатељи, ".NЕТ" девелопер заједница је узбуђена што вас види овде!</value></data>
</root>
MessageService.sr-Latn.resx:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="GreetingMessage" xml:space="preserve"><value>Zdravo prijatelji, ".NET" developer zajednica je uzbuđena što vas vidi ovde!</value></data>
</root>
下面是 ParameterizedMessageService
资源文件的示例内容,从 ParameterizedMessageService.resx 开始:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="DinnerPriceFormat" xml:space="preserve"><value>On {0:D} my dinner cost {1:C}.</value></data>
</root>
ParameterizedMessageService.sr-Cyrl-RS.resx:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="DinnerPriceFormat" xml:space="preserve"><value>У {0:D} моја вечера је коштала {1:C}.</value></data>
</root>
ParameterizedMessageService.sr-Latn.resx:
<?xml version="1.0" encoding="utf-8"?>
<root><data name="DinnerPriceFormat" xml:space="preserve"><value>U {0:D} moja večera je koštala {1:C}.</value></data>
</root>
提示
为简洁起见,有意省略所有资源文件 XML 注释、架构和 <resheader>
元素。
4.1 示例运行
以下示例运行显示给定目标区域设置的各种本地化输出。
以 "sr-Latn"
为例:
dotnet run --project .\example\example.csproj sr-Latnwarn: Localization.Example[0]Zdravo prijatelji, ".NET" developer zajednica je uzbuđena što vas vidi ovde!
warn: Localization.Example[0]U utorak, 03. avgust 2021. moja večera je koštala 37,63 ¤.
当省略运行项目的 .NET CLI 参数时,使用默认系统区域性,在本例中为 "en-US"
:
dotnet run --project .\example\example.csprojwarn: Localization.Example[0]Hi friends, the ".NET" developer community is excited to see you here!
warn: Localization.Example[0]On Tuesday, August 3, 2021 my dinner cost $37.63.
传递 "sr-Cryl-RS"
时,将找到正确的相应资源文件并应用本地化:
dotnet run --project .\example\example.csproj sr-Cryl-RSwarn: Localization.Example[0]Здраво пријатељи, ".NЕТ" девелопер заједница је узбуђена што вас види овде!
warn: Localization.Example[0]У уторак, 03. август 2021. моја вечера је коштала 38 RSD.
示例应用程序不提供 "fr-CA"
的资源文件,但在使用该区域性调用时,将使用非本地化的资源文件。
警告
由于已找到区域性,但未找到正确的资源文件,因此应用格式设置时,最终会实现部分本地化:
dotnet run --project .\example\example.csproj fr-CAwarn: Localization.Example[0]Hi friends, the ".NET" developer community is excited to see you here!
warn: Localization.Example[0]On mardi 3 août 2021 my dinner cost 37,63 $.
相关文章:

【微软技术栈】C#.NET 中的本地化
本文内容 资源文件注册本地化服务使用 IStringLocalizer<T> 和 IStringLocalizerFactory将其放在一起 本地化是针对应用支持的每个区域性,将应用资源转换为本地化版本的过程。 只有在完成本地化评审步骤,以验证全球化应用是否做好本地化准备后&a…...

【qemu逃逸】华为云2021-qemu_zzz
前言 虚拟机用户名:root 无密码 设备逆向 经过逆向分析,可得实例结构体大致结构如下: 其中 self 指向的是结构体本身,cpu_physical_memory_rw 就是这个函数的函数指针。arr 应该是 PCI 设备类结构体没啥用,就直接用…...

vue递归获取树形菜单
文章目录 前言什么是递归? 一、数据集二、 递归函数三、打印树形结构展示 前言 什么是递归? 程序调用自身的编程技巧称为递归( recursion)。 递归 粗略的理解为 循环 ,只不过 递归 是调用自身。 在实际使用中…...

[ubuntu]ubuntu22.04默认源和国内源
sudo vi /etc/apt/sources.list 请选择和系统对应的版本,查看系统版本命令: lsb_release -a Distributor ID: Ubuntu Description: Ubuntu 22.04 LTS Release: 22.04 Codename: jammy Ubuntu不同的版本配置的有…...

Map和ForEach的区别,For in和For of的区别
Map和ForEach的区别: 共同点:都可以遍历数组,this指向window,都不会改变原数组。 不同点:map返回一个数组,不会对空数组进行检测,如果是空数组map的话还是返回一个空数组,而空数组…...

json字符串属性名与实体类字段名转换
在项目开发过程中,会遇到实体类字段名与交互的json对象属性名不一致的情况,比如前段使用的是下划线方式定义,后端采用的是驼峰式定义,其他系统使用t表示一个时间戳,自己的系统使用timestamp定义。遇到这种情况…...

Vue Vuex模块化编码
正常写vuex的index的时候如果数据太多很麻烦,如有的模块是管理用户信息或修改课程等这两个是不同一个种类的,如果代码太多会造成混乱,这时候可以使用模块化管理 原始写法 如果功能模块太多很乱 import Vue from vue import Vuex from vuex …...

消费者忠诚度研究:群狼调研帮您制定忠诚客户计划
在当今竞争激烈的市场环境中,消费者忠诚度对于企业的成功至关重要。消费者忠诚度不仅关系到企业的市场份额和盈利能力,还直接影响着企业的品牌形象和声誉。群狼调研作为一家专业的市场研究机构,专注于消费者忠诚度研究,为企业提供…...

接口幂等性详解
1. 什么是幂等性 幂等性指的是对同一个操作的多次执行所产生的影响与一次执行的影响相同。无论操作执行多少次,系统状态都应该保持一致。 在计算机科学和网络领域中,幂等性通常用来描述服务或操作的特性。对于RESTful API或HTTP方法,一个幂…...

Java操作redis常见类型数据存储
一,Java连接Redis 1.1 导入依赖 打开IDEA在pom.xml导入依赖 注意:要在dependencies标签中导入 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> &…...

【深度学习】pytorch——Autograd
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 深度学习专栏链接: http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…...

【ARM 安全系列介绍 1 -- 奇偶校验与海明码校验详细介绍】
文章目录 奇偶校验介绍奇偶校验 python 实现奇偶校验C代码实现 海明码详细介绍 奇偶校验介绍 奇偶校验是一种错误检测方法,广泛应用于计算机内部以及数据通信领域。其基本原理是为了使得一组数据(通常是一字节8位)中的“1”的个数为偶数或奇…...

分享34个发布商会PPT,总有一款适合您
分享34个发布商会PPT,总有一款适合您 链接:https://pan.baidu.com/s/1jP9toqTZONWeDIcxvw1wxg?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付费甚…...

047_第三代软件开发-日志分离
第三代软件开发-日志分离 文章目录 第三代软件开发-日志分离项目介绍日志分离用法 关键字: Qt、 Qml、 log、 日志、 分离 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C 的强…...

ChinaSoft 论坛巡礼 | 系统与网络安全论坛
2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…...

Ubuntu Gitlab安javascript:void(‘numberedlist‘)装
原因: 代码越改越多,越难维护,开发代码和发布代码融为一体;2人以上开发,都会修改代码,修改次数一多,代码难以维护 其中:前往Gitlab官网:gitlab/gitlab-ce - Packages pa…...

11.4-GPT4AllTools版本已开始对小部分GPT3.5用户内测推送
OpenAI已经开始小规模推送GPT4 AllTools功能,部分GPT博主已经第一时间体验了此功能,此功能特色是整合目前的多模态功能以及文件上传和联网模块,无需切换,更要全面综合 可上传包括 PDF、数据文件在内的任意文档,并进行分…...

竞赛选题 深度学习手势检测与识别算法 - opencv python
文章目录 0 前言1 实现效果2 技术原理2.1 手部检测2.1.1 基于肤色空间的手势检测方法2.1.2 基于运动的手势检测方法2.1.3 基于边缘的手势检测方法2.1.4 基于模板的手势检测方法2.1.5 基于机器学习的手势检测方法 3 手部识别3.1 SSD网络3.2 数据集3.3 最终改进的网络结构 4 最后…...

语言模型AI——聊聊GPT使用情形与影响
GPT的出现象征着人工智能自然语言处理技术的一次巨大飞跃。从编程助手到写作利器,它的身影在各个行业中越来越常见。百度【文心一言】、CSDN【C知道】等基于GPT的产品相继推出,让我们看到了其广泛的应用前景。然而,随着GPT的普及,…...

浅谈事件冒泡和事件捕获
事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。 <div id"div1"><div id"div2"><div id"div3">click</div></div> <…...

CSS 背景、文本、字体
CSS背景: CSS背景属性用于定义HTML元素的背景。CSS属性定义背景效果:background-color;background-image;background-repeat;background-attachment;background-position。 background-color属性定义元素…...

爬取Elastic Stack采集的Nginx内容
以下是一个简单的Go语言爬虫程序,用于爬取Elastic Stack采集的Nginx内容。请注意,这只是一个基本的示例,实际使用时可能需要根据具体情况进行修改和扩展。 package mainimport ("fmt""net/http""io/ioutil" )…...

python 机器学习 常用函数
一 np.random.randint "randint" 是 "random integer" 的缩写,表示生成随机整数。 np.random.randint 是 NumPy 库中的一个函数,用于生成随机整数。以下是该函数的一般语法: np.random.randint(low, high, size)其中…...

手写操作系统篇:环境配置
文章目录 前言C环境配置Rust环境配置Qemu安装 前言 这篇博客先配置好我们之后的开发环境,下载一些依赖的软件包 建议大家使用ubuntu操作系统 C环境配置 sudo apt-get update && sudo apt-get upgrade sudo apt-get install git wget build-essential gdb…...

地理信息系统原理-空间数据结构(7)
四叉树编码 1.四叉树编码定义 四叉树数据结构是一种对栅格数据的压缩编码方法,其基本思想是将一幅栅格数据层或图像等分为四部分,逐块检查其格网属性值(或灰度);如果某个子区的所有格网值都具有相同的值࿰…...

三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计
1,小程序的默认显示 分为三部分,头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面,这是在app.json文件中配置的。代码如下: //所有用到的页面都需要在 pages 数组中列出,否则小程序可能会出现错误或…...

学习Opencv(蝴蝶书/C++)相关——2.用clang++或g++命令行编译程序
文章目录 1. c/cpp程序的执行1.1 cpp程序的编译过程1.2 预处理指令1.3 编译过程的细节2. macOS下使用Clang看cpp程序的编译过程2.1 示例2.1.1 第一步 预处理器-preprocessor2.1.2 第二步 编译器-compiler2.1.3 第三步 汇编器-assembler2.1.4 第四步 链接器-linker2.1.5 链接其他…...

【Unity细节】VS不能附加到Unity程序中解决方法大全
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶🌫️收录于专栏:unity细节和bug 😶🌫️优质专栏 ⭐【…...

线上 kafka rebalance 解决
上周末我们服务上线完毕之后发生了一个kafka相关的异常,线上的kafka频繁的rebalance,详细的报错我已经贴到下面,根据字面意思:消费者异常 org.apache.kafka.clients.consumer.CommitFailedException: 无法完成提交,因为…...

[100天算法】-第一个错误的版本(day 62)
题目描述 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你…...