代码之家  ›  专栏  ›  技术社区  ›  Palantir

ASP.NET MVC:本地化

  •  4
  • Palantir  · 技术社区  · 15 年前

    我的目标语言是会话[“lang”],它可以是“en”或“it”。我已将此添加到网站。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>
    

    我在应用程序globalresources中有两个文件,分别是global.resx和global.en.resx。

    问题是,无论lang变量中是什么,我总是从main global.resx得到结果,而且我从未从global.en.resx得到英文版本。

    我完全错了??

    我试着安装系统。线程…在global.asax.cs中是应用程序的一部分,但结果相同。

    谢谢

    附言:我想问一个简单的方法使这项工作。如果我要用复杂的方式,我会这样做: http://helios.ca/2009/05/27/aspnet-mvc-and-localization/

    2 回复  |  直到 15 年前
        1
  •  4
  •   Kostas Konstantinidis    15 年前

    我的ASP.NET MVC应用程序中有相同的dilema(如何实现本地化)。

    我遵守了张贴的指示 here 它就像一个魅力。

    所以我在“内容”下创建了一个名为“本地化”的文件夹,然后为我要翻译的每种语言创建资源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 %>
    
        2
  •  3
  •   Arnis Lapsa    15 年前

    我敢打赌这个是复制品。
    不管怎样-你只需要 here (假设您正在使用WebForms ViewEngine(也可能与其他人一起使用,但尚未调查))。

    哦…好吧…下面是我的“总结”:

    帮手只是其中的一部分。您还需要对默认视图引擎进行一些修改。在createview/createpartialview上,它应返回localizionwebformview,该视图向viewdata添加一个路径键,该路径键由htmlhelper用于查找ResourceExpressionFields,并将其传递给localizionhelpers类,后者检索所需的值。

    小奖金=>

    如果不想为视图子文件夹重新创建资源文件夹,这可能很方便
    (如果修改viewengine.view/partialview位置格式):

     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.ScottAllen建议的那样,避免使用app_GlobalResources和app_LocalResources可能是一个好主意(查看Konstantinos的答案)。