【问题标题】:asp.net MVC: localizationasp.net MVC:本地化
【发布时间】:2009-09-24 04:06:35
【问题描述】:

我在 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/

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    我在我的 asp.net mvc 应用程序中遇到了同样的困境(如何实现本地化)。

    我按照here 发布的说明进行操作,效果很好。

    所以我在 Content 下创建了一个名为 Localization 的文件夹,然后为我要翻译的每种语言创建 Resources resx 文件。请记住,resx 文件名有一个约定。即

    Resources.resx 是所有内容的默认后备。

    Resources.en-GB.resx 用于英文 GB

    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 模块或动作过滤器”。也许这样就没有办法了?
    • 当然有一种方法可以设置文化。如果它是您网站的用户偏好,那么您将其存储在 cookie 中并创建一个控制器,在实例化时(构造函数)您读取 cookie 并设置 CultureUI/Culture。然后你的所有控制器都应该从那个控制器继承。
    • 当您阅读您的语言环境并想要设置它时,您可以这样做: System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
    • 按照我发布的链接和此处发布的说明进行操作。否则将无法正常工作。
    • 很好,多亏了你的代码,我才开始工作 :) 我添加了 SmartController,从 App_GlobalResources 文件夹中取出资源到基础文件夹并根据文章更改了它们的属性,最后更改了en to en-US...那是一次漫长的旅行!
    【解决方案2】:

    我敢打赌这个是重复的。
    无论如何-您只需要here(假设您正在使用webforms viewengine(可能也可以与其他人一起使用,尚未调查)。

    哦,好吧……这是我的“总结”:

    助手只是一部分。您还需要对默认视图引擎进行一些修改。在 createview/createpartialview 上,它应该返回本地化webformview,它为 viewdata 添加了一个路径键,htmlhelper 使用它来查找资源表达式字段并将它们传递给检索所需值的本地化助手类。

    小红包=>

    如果您不想为查看子文件夹重新创建资源文件夹,这可能会很方便
    (如果您修改 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 的答案)。

    【讨论】:

    • 如果您在网站上包含信息摘要,我会对此表示赞同。
    • 已经试过了,它到处都是链接的,但它并不能说明整个故事。它只是提供帮助程序从资源文件中获取内容。我的设置中有一个错误,因此该方法无论如何都不起作用(检查前两段,
    • 这是一个指向 zip 的链接,其中包含您应该调查的源代码 => eworldui.net/files/LocalizationHelpers.zip
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多