ASP.NET MVC:本地化

4

我有一个目标语言存储在Session["lang"]中,可以是"en"或者"it"。我已经将其添加到Site.master中:

<script runat="server">
  void Page_Load(object sender, EventArgs e) {
    string lang = Session["lang"].ToString();
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang);
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(lang);
  }
</script>

接着,我想像这样调用资源字符串:

<asp:Label ID="Label1" runat="server" Text="<%$ Resources:Global, test %>"></asp:Label>

在App_GlobalResources文件夹中,我有两个文件,分别命名为Global.resx和Global.en.resx。
问题在于,无论lang变量中输入什么,我总是从主Global.resx获取结果,而且从Global.en.resx中永远无法获取英文版本。
我完全错了吗?
我尝试将System.Threading...部分放在Global.asax.cs中的Application_PreRequestHandlerExecute方法中,但结果相同。
谢谢
PS:我正在寻求一种简单的方法使其工作。如果我要使用复杂的方法,我会选择这个:http://helios.ca/2009/05/27/aspnet-mvc-and-localization/
2个回答

4
我在我的asp.net mvc应用中遇到了同样的困境(如何实现本地化)。
我按照这里发布的说明进行操作,它非常好用。
因此,我创建了一个名为“Localization”的文件夹,在其中为每种语言创建了资源resx文件。请记住,resx文件名称有一定的约定。例如:
Resources.resx是默认的回退选项。
Resources.en-GB.resx用于英国英语。
Resources.en-US.resx用于美国英语。
等等。
只需确保您遵循链接中发布的说明来嵌入并使资源在应用程序的所有位置(视图、控制器等)中可用即可。
编辑:
我想补充一点,我从web.config中省略了这行代码,因为我想手动设置我的应用程序的本地化。
<globalization uiCulture="auto" culture="auto"/>

我创建了以下类:

    public class SmartController : Controller
{
    public SmartController()
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
        System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
    }
}

所有控制器都继承自这个类。
由于这是一个管理员设置的区域,我必须从我的应用程序设置中进行设置。您可以从Cookies中读取并设置它,或者以其他方式设置它。在我看来,这是迄今为止遇到的最简单的本地化解决方案。
一旦实施,您可以通过以下简单的代码行引用添加的任何字符串,无需额外的代码。
<%= Resources.Strings.TranslatedTerm %>

很抱歉,这并没有什么帮助:它只是说“如果您需要根据用户的偏好或URL参数设置文化,则最好的方法是编写自定义HTTP模块或操作筛选器”。也许这样做的方法就不存在? - Palantir
当您阅读您的语言环境并想要设置它时,可以按以下方式执行: System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); - Kostas Konstantinidis
请按照我发布的链接和这里的说明进行操作,否则无法正常工作。 - Kostas Konstantinidis
好的,多亏了你的代码我成功让它工作了 :) 我添加了 SmartController,并将资源从 App_GlobalResources 文件夹移到基础文件夹并根据文章更改了它们的属性,最后将 en 更改为 en-US... 这是一次漫长的旅程! - Palantir
关于这个问题的说明:如果语言信息被保存在Session对象中,那么这个方法不起作用,因为在控制器构造函数中Session对象始终为null。解决方法是创建SmartController,但不要使用构造函数,而应该重写OnActionExecuting,在该方法中可访问Session对象。 - Palantir
显示剩余2条评论

3
我敢打赌这是一个重复的内容。
不管怎样 - 你只需要在这里(假设你正在使用WebForms视图引擎(其他视图引擎也可能适用,我没有调查))。

噢好吧...这是我的“摘要”:

Helpers仅仅是其中的一部分。您还需要对默认的视图引擎进行一些修改。在createview/createpartialview上,它应该返回localizationwebformview,该视图添加了一个路径键到viewdata中,这个键由htmlhelper用于查找resourceexpressionsfields并将它们传递给localizationhelpers类来检索所需的值。

额外的小奖励=>

如果您不想为视图子文件夹重新创建资源文件夹,这可能会很方便
(如果您修改了viewengine.view/partialviewlocationformats的情况下):

 private static string ReformatVirtualPath(string virtualPath)
        {
            //This allows NOT to duplicate App_localResources directory
            // ~/Views/Shared/Partial/Some/BulltihS/_View.ascx
            // turns into =>
            // ~/Views/Shared/_View.ascx
            var start = @"(~(/?\w*/?){2})";
            var end = @"(\w*.as(c|p)x)";

            start = Regex.Match(virtualPath, start).Value;
            end = Regex.Match(virtualPath, end).Value;

            return start + end;
        }

用法:

 internal static ResourceExpressionFields GetResourceFields
            (string expression, string virtualPath)
        {
            virtualPath = ReformatVirtualPath(virtualPath);

            var context = new ExpressionBuilderContext(virtualPath);
            var builder = new ResourceExpressionBuilder();
            return (ResourceExpressionFields)
                   builder.ParseExpression(expression, typeof(string), context);
        }

编辑:
但是像K. Scott Allen建议的那样避免使用App_GlobalResources和App_LocalResources可能是个好主意(请查看Konstantinos的回答)。


如果您在网站上包含信息摘要,我会点赞此内容。 - tvanfosson
已经尝试过了,它被链接到各处,但它并没有讲述完整的故事。它只提供了一些帮助从资源文件中获取东西的方法。我在我的设置中有一个错误,因此那种方法也不会起作用(请检查前两段,asp:Label调用应该仍然有效,然后这篇文章是关于远离那种语法以使事情更符合MVC风格)。 - Palantir
这是一个链接,指向包含源代码的zip文件,你应该进行调查 => http://www.eworldui.net/files/LocalizationHelpers.zip - Arnis Lapsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接