C#学习教程:没有RazorView的Nancy本地化我可以在razor中访问我的资源文件:@Text.text.greeting但我想切换到不同的视图引擎。是否有任何其他可用的支持TextResource的视图引擎?SuperSimpleViewEngine中的本地化是如何工作的?或者有没有办法使用模型访问资源?好问题!这是我需要自己做的事情。我设法使用@Karl-JohanSj?gren给你的建议解决了这个问题——也就是说,我能够创建超级简单视图引擎(SSVE)的扩展。SSVE背景的设计方式使您可以注入额外的“匹配器”,允许您在为请求输出呈现视图模板时对它们进行一些处理。您会注意到SSVE中的以下构造函数(截至2014年5月12日),允许您传入额外的“匹配器”:publicSuperSimpleViewEngine(IEnumerablematchers){this.matchers=matchers??Enumerable.Empty();this.processors=newList>{PerformSingleSubstitutions,PerformContextSubstitutions,PerformEachSubstitutions,PerformConditionalSubstitutions,PerformPathSubstitutions,PerformAntiForgeryTokenSubstitutions,this.PerformPartialSubstitutions,this.PerformMasterPageSubstitutions,};};}大部分数字模板替换在SSVE中工作的基本方法是对图像模板进行非常简单的规则表达式匹配。如果正则表达式匹配,则调用replace方法,在适当的地方进行替换。例如,SSVE附带的默认PerformSingleSubstitutions处理器/匹配器用于执行基本的“@Model”。代换。可能会发生以下处理器工作流程:实施好的,现在我们已经有了基础知识,下面是创建自己的翻译匹配器的方法。?首先,您需要创建一个ISuperSimpleViewEngineMatcher的实现。下面是我为了说明而创建的一个非常基础的例子:internalsealedclassTranslateTokenViewEngineMatcher:ISuperSimpleViewEngineMatcher{//////CompiledRegexfortranslationsubstitutions.///privatestaticreadonlyRegexTranslationSubstitutionsRegEx;staticTranslateTokenViewEngineMatcher(){//此正则表达式将匹配如下字符串://@Translate.Hello_World//@Translate.FooBarBaz;TranslationSubstitutionsRegEx=newRegex(@"@Translate.(?[a-zA-Z0-9-_]+);?",RegexOptions.Compiled);}publicstringInvoke(stringcontent,dynamicmodel,IViewEngineHosthost){returnTranslationSubstitutionsRegEx.Replace(content,m=>{//找到匹配项!stringtranslationResult;//获取翻译'key'。vartranslationKey=m。Groups["TranslationKey"].Value;//加载适当的翻译。这可以转移到//例如ResourceManager。下面的实现//显然不是很有用,只是说明性的。:)if(translationKey==“你好_世界”){translationResult="你好,世界!";}else{//我们没有找到任何翻译键匹配,所以我们将//使用键本身。translationResult=translationKey;}返回翻译结果;});}}好的,所以当上面的匹配器针对我们的视图模板运行时,它们会找到以“@Translate”开头的字符串“@Translate”之后的文本。被认为是我们的翻译关键。因此,在“@Translate.Hello_World”的示例中,翻译键将为“Hello_world”。当匹配发生时,将触发replace方法以查找并返回翻译键的相应翻译。我当前的示例只是返回“Hello_World”键的翻译——您当然必须填写自己的翻译查找机制,或许使用.net的默认资源管理支持?匹配器不会自动连接到SSVE,您必须使用Nancy支持的IoC功能来根据我之前强调的构造函数参数注册匹配器。为此,您需要覆盖NancyBootstrapper中的ConfigureApplicationContainer方法并添加类似于以下内容的注册:publicclassMyNancyBootstrapper:DefaultNancyBootstrapper{//为我们的视图注册自定义/额外的处理器/匹配器//在SSVE容器中渲染.Register>((c,p)=>{returnnewList(){//这个匹配器提供对@Translate的支持。TranslateTokenViewEngineMatcher()};});}...最后一步是将您的翻译令牌实际添加到您的手表:TranslatorTest@Translate.Hello_World;正如我所说,这是一个非常基本的示例,您可以将其用作创建满足您需要的实现的基础。例如,您可以扩展正则表达式匹配器以考虑要翻译到的目标文化,或者只使用在您的应用程序中注册的当前线程文化。您可以根据自己的需要灵活操作。?我现在自己做了解决方案,因为我不能使用资源文件。在我的模型中,我有一个动态文本对象,其中包含使用正确语言的资源。(语言取决于当前用户并且是一个整数)publicdynamicText{get;私有集;起初我按语言构建静态词典。私人静态字典消息=空;我创建了一个ResourceDictionary来填充动态对象:以上是C#学习教程:Nancy'slocalization没有razorview的全部内容,如果对大家有用需要详细了解C#学习教程,希望大家会更加关注它—publicclassResourceDictionary:DynamicObject{privateDictionarydictionary;publicResourceDictionary(){dictionary=newDictionary();}publicvoidAdd(stringkey,stringvalue){dictionary.Add(key,value);}publicoverrideboolTryGetMember(GetMemberBinderbinder,outobjectresult){字符串数据;if(!dictionary.TryGetValue(binder.Name,outdata)){thrownewKeyNotFoundException("Keynotfound!");}}结果=(字符串)数据;返回真;}publicoverrideboolTrySetMember(SetMemberBinderbinder,objectvalue){if(dictionary.ContainsKey(binder.Name)){dictionary[binder.Name]=(string)value;}else{dictionary.Add(binder.Name,(string)value);}返回真;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
