【发布时间】:2015-01-28 09:10:44
【问题描述】:
客户希望能够将任何语言添加到我目前正在构建的基于多语言 MVC 的站点中。
他们将负责自己提供翻译,虽然该过程不需要通过 GUI 启用,但它需要足够简单,因此重新编译项目是不行的。编辑文本文件(可能是 XML)是可以的。
在Web.config 文件中使用分号分隔的语言代码列表(例如:en-US;de-GE 等)并在App_GlobalResources 文件夹中使用RESX 文件我能够满足条件。 . 至少只要资源在 Razor 页面或 MVC 控制器中使用。
但是有一个问题 - 任何尝试使用 MVC 视图模型类中的资源(例如 Display 属性或 Compare 属性)都会引发错误:
System.InvalidOperationException:无法检索属性“名称”,因为本地化失败。类型“[此处的资源类型]”不是公共的或不包含名称为“[此处的资源名称]”的公共静态字符串属性。
There are several StackOverflow 上已经处理过这个问题,但所有这些问题都围绕着将资源文件从 content 文件转换为 嵌入式资源 .虽然这可能会使代码功能,但对我没有好处,因为客户端无法再编辑资源!
在这种情况下我还能做什么?
【问题讨论】:
-
可以让客户端不编辑资源,而是编辑内容文件,然后把这些内容文件变成资源。
-
如果您有分层架构,那么很难获得这样的功能,例如在发布构建时,您的 resx 文件也将被编译,并且难以编辑 dll。所以我建议您将所有键值移动到数据库,然后将其移动到缓存层。
-
@Aaron 你真的需要扩展那个评论,因为我不明白你的意思......
-
@RoyDictus 我不确定我是否遵循。我们的想法是让网站支持多语言,并让客户能够在未来添加更多语言。 Razor 内容文件显然很容易编辑(因为它们只是文本文件),但这绝不提供多语言站点。虽然我可以用
@Resources.MyResource.DisplayName替换所有Html.LabelFor的情况,但仍然存在视图模型中定义的错误消息或验证器的问题。
标签: c# asp.net-mvc