宝哥软件园

从ASP.NET核心自定义本地化教程的文本文件中读取本地化字符串

编辑:宝哥软件园 来源:互联网 时间:2021-08-30

前言

本文简要介绍了ASP.NET核心2.0的全球化和本地化。默认本地化从资源文件(resx)中读取本地化字符串。然后,本文提供了一个简单的示例,说明如何自定义本地化,以便从文本文件中读取本地化字符串。

实施全球化和本地化

国际化包括全球化和本地化。全球化是设计支持不同文化的应用程序的过程。全球化为一组关于特定地理区域的已定义语言脚本增加了输入、显示和输出支持。

本地化是调整已针对特定区域性/地区进行本地化处理的全局应用程序的过程。有关更多信息,请参考本文档末尾的全球化和本地化术语。

应用本地化包括以下内容:

使应用程序内容可本地化为支持的语言和文化,并提供本地化资源实施策略。为每个请求选择语言/文化。全球化和本地化主要在两个位置实现,一个是控制器,另一个是视图。要在视图中实现全球化和本地化,请在“启动”中添加。配置服务()

服务。AddMvc()。AddViewLocalization(微软。AspNetCore . MVC . razor . languageviewplocationexpanderformat .后缀,opt={ opt。资源路径=“资源”;})服务。configure(opts={ var supported cultures=new HashSetCultureInfo { culture info }。当前文化,文化信息。CurrentUICulture,new CultureInfo('zh '),new CultureInfo('en '),};//格式化数字、日期等。选择。supported cultures=supported cultures。to list();////我们已经本地化的UI字符串。选择。支持的培养=支持的培养。to list();});AddViewLocalization()是在Microsoft中定义的。aspnetcore.localization命名空间。选择。资源路径=“资源”是指在“资源”文件夹中查找本地化的资源文件。第二个代码设置该应用程序支持的语言。似乎没有简单的方法说它支持任何语言。

您还需要在启动时启动请求本地化中间件。配置()。默认设置从网址、Cookie、HTTP接受语言头中读取目标语言。

public void Configure(iappressionbuilder应用程序,IHostingEnvironment env){ var options=app。applicationservice . GetServiCe();app。UseRequestLocalization(选项。价值);app。UseMvc();}然后,在视图中添加cshtml文件

@注入微软。AspNetCore . MVC . localization . iview localizer Lofieldset Legend @ Lo['显示以下列']/Legend div id=' visiblecolumnfortable ' class=' loading-prompt ' data-time=' 10 '/div/field set。现在,直接运行程序进行测试,程序将输出Show如下列。这表明,如果ASP.NET核心找不到资源文件,它将输出键名。因此,微软建议直接在ASP.NET芯使用自然语言作为键名。

然后添加资源文件。ASP.NET核心支持两种资源文件组织方案。因为我们选择了语言视图位置扩展格式。后缀添加AddViewLocalization时,假设要为ViewHomeIndex.cshtml提供简体中文文本,要么创建Resources View Home index . zh-cn . resx,要么创建Resources View . Home . index . zh-cn . resx,同样,Shared u layout . cshtml的本地化文件应该放在Resources View Shared u layout . zh-cn . resx或Resources View . Shared . layout . zh-cn . resx中,如下图所示。

自定义本地化文件

从上面可以看出,IViewLocalizer接口负责从resx资源文件中查找本地化文本。如果您想从其他位置查找本地化文本,您需要自定义一个实现IHtmlLocalizer或IStringLocalizer的类。IHtmlLocalizer用HTML编码文本参数,建议实现。事实上,本地化控制器所需的类实现了IStringLocalizer。

假设我们想阅读d : documents paradox interactive stellar is mod cn localization l . Chinese(简体)中的文本。yml,其内容是

"否_领导者"无领袖上将舰队司令nomad _ admiral ' $ admiral $ ' ADMIRALS '舰队司令"将军"将军科学家科学家州长总督尺子统治者'

一行的开头是键名,空格后是本地化字符串。

公共类YamlStringLocalizer : iht allocializer { private readonly Dictionary language Dictionary=new Dictionary();公共本地化字符串GetString(字符串名称){引发新的notimplementdexception();}公共本地化字符串GetString(字符串名称参数对象[]参数){抛出新的notimplementDexception();} public IEnumerable GetalStrings(bool includeParentCultures){ throw new notimplementDexception();}公共带区域性的ihtmallocializer(区域性信息区域性){引发新的notimplementdexception();}公共本地化html字符串this[字符串名称]{ get { var ci=culture info .当前文化;var languageName=ci .是欧洲文化吗?ci .英语名称: ci .家长。EnglishNamevar path=@ ' d : Documents Paradox Interactive star is mod cn localization l . $ { language name } .yml ';if (languageDictionary .TryGetValue(languageName,out var content)=false){ if(File .存在(路径)=假)返回新的本地化的html字符串(名称,名称,没错,路径);内容=文件ReadAllText(路径);语言词典。添加(语言名称,内容);} var regex=新Regex(@'^s*'名称@':s ' '(.*?)' ' s*$ ',正则表达式.多线);var match=regex .匹配(内容);如果(匹配。成功){ var值=匹配。群组[1]。价值;返回新的本地化的html字符串(名称,值);} else {返回新的本地化html字符串(名称、名称真实,路径);} } }公共本地化html字符串this[字符串名称,params对象[]参数]=引发新的notimplementdexception();}代码很简单,读取l.yml的所有文字,保存在缓存中,然后用正则表达式匹配键。

在视图里,我们需要改用YamlStringLocalizer。

@注入微软AspNetCore。MVC。本地化。iview本地化器Lo @ inject YamlStringLocalizer YLo但是YamlStringLocalizer还没有向依赖注入注册,所以还要把启动。配置服务()改成

public void ConfigureServices(IServiceCollection services){ services .AddSingleton();服务AddMvc().AddViewLocalization(微软AspNetCore。MVC。剃刀。languageview plocationexpander format。后缀,opt={ opt .资源路径="资源";}) .}总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

更多资讯
游戏推荐
更多+