我正在尝试基于this article在我的项目中Internationalisation
。但在LanguageController.cs
方法的Language
文件中:
public JavaScriptResult Language()
{
return GetResourceScript(Resources.Language.ResourceManager); //Error
}
我收到此错误:
The name 'Resources' does not exist in the current context
什么是错的呢?
答案 0 :(得分:6)
您应该在应用程序中添加Resources.resx
文件。还要注意添加它的文件夹。例如,App_GlobalResources
是一个特殊的ASP.NET文件夹,您应该尝试将resx文件放在其他位置。
答案 1 :(得分:4)
有时,当您的活动命名空间与Resource.Designer.cs文件不在同一名称空间中时,或者命名空间与其他活动不同时,会发生这种情况。
答案 2 :(得分:0)
如果您使用的是ASP.Net MVC,请遵循以下文章:http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx
答案 3 :(得分:0)
我知道这已被列为答案,但是当前答案实际上对我没有帮助(因为我已经按照该步骤进行了操作)。以防万一其他人正在搜索并且像我一样没有足够的经验,我不得不为用来解决此问题的每种资源添加一行代码。即
var newName = NameSpace.Properties.Resources.resourceName;
显然,请为您自己的项目相应地替换newName,Namespace和resourceName。使用完之后,我可以引用新变量并将其用于我的项目。我可能迟于5年才回答这个问题,但以防万一其他新手在成功添加新资源后遇到了同样的问题。
答案 4 :(得分:0)
http://odetocode.com/Blogs/scott/archive/2009/07/16/resource-files-and-asp-net-mvc-projects.aspx中的旧文章(现已失效):
在控制器代码中使用App_GlobalResources
中的资源文件会破坏单元测试。
将.resx
文件放在特殊的App_GlobalResources
文件夹中时,IDE将使用GlobalResourceProxyGenerator
生成强类型的内部类来将资源包装在其中。内部类使MVC项目中的任何代码均可访问资源:
var greeting = Resources.Greeting;
您也可以从视图中使用资源:
@Html.Encode(Resources.Strings.Greeting)
问题在于,全局资源实际上并未嵌入到项目的.dll中。而是由ASP.NET运行时使用内部资源创建一个App_GlobalResources
程序集。该程序集由ASP.NET创建的所有视图程序集引用,并由GlobalResourceProxyGenerator
生成的强类型包装器显式加载。由于App_GlobalResources
程序集在没有ASP.NET编译阶段的情况下不存在,因此在运行单元测试时不可用。试图访问资源的受测试控制器代码将炸弹,但有异常。
请注意,使用上面显示的视图语法时,您还将遇到一些Intellisense问题。我猜这是因为IDE在两个地方(项目程序集)看到了资源包装器,而包装器也进入了ASP.NET在Temporary ASP.NET Files文件夹中创建的App_GlobalResource
中,因此感到困惑。 )。
有一种方法可以使resx
中的App_GlobalResources
个文件起作用,但是在MVC项目(或Web应用程序项目)中,文件夹并不是真正必需的。我认为将resx文件添加到其他位置(甚至是单独的类库)也一样容易,以避免对App_GlobalResources
的行为产生任何混淆。
简而言之::避免在MVC中使用App_GlobalResources
和App_LocalResources
(存在其自身的问题)。
如果将resx
文件添加到MVC项目或类库中的任何其他文件夹,则resx
会自动设置为嵌入到项目的输出程序集中-这很好。 IDE还为resx
分配了ResxCodeFileGenerator
的自定义工具以生成强类型包装器-这很好。默认情况下,生成的类是内部类–这很不好。 (通过ASP.NET)为视图创建的程序集将无法使用内部类,因为它位于不同的程序集(在Visual Studio中编译的项目程序集)中。
解决方案
简单的解决方法是确保将自定义工具设置为PublicResXFileCodeGenerator
而不是ResXCodeFileGenerator
。您可以在文件的属性窗口中执行此操作,也可以在为您提供“访问修饰符”下拉菜单的资源编辑器中进行选择(选项为Internal,Public和No Code Generation –选择Public)。
您还可以在属性窗口中为生成的包装器设置“自定义工具命名空间”。我的建议是对全局资源使用诸如“Resources”
之类的约定,对于专用于特定视图的资源使用“Resources.Controller.View”
之类的约定。
这种方法意味着您可以在可单元测试的控制器代码和视图中使用资源。语法与上面相同。包装器类中使用的ResouceManager
可以根据线程的当前UI区域性设置自动解析要使用的适当资源。
在Web请求处理过程中有效实施正确的UI文化的最简单方法是使用web.config
的全球化部分。
<globalization uiCulture="auto" culture="auto"/>
以上内容将为请求设置当前的UI文化和当前的文化设置。
如果您需要根据用户的喜好或URL参数设置区域性,那么最好的选择是编写自定义HTTP模块或操作过滤器。
如果要将Resources.xx-YY.resx
文件放在单独的文件夹(即MyNamespace/Localization
)中,请将Custom Tool Namespace
设置为MyNamespace
,则视图将识别资源文件。
您可能还需要更改Resources.Designer.cs
文件: