【问题标题】:Preparing for Internationalization of Asp.net MVC website为 Asp.net MVC 网站的国际化做准备
【发布时间】:2016-11-08 03:09:15
【问题描述】:

我将创建一个网站,我知道该网站将以多种语言呈现。但是,对于第一个版本,我们只需要英文版。一旦这些功能都正常工作,我们将添加其他语言。

不幸的是,由于 Asp.Net Core 中没有足够的功能,我们不得不为网站使用 Asp.Net MVC 5。我的问题有两部分:

  1. 目前,哪种做法被认为是最好的方法?使用资源文件并将它们加载到剃须刀页面中?使用框架?我们能否以某种方式使用 Asp.Net MVC 6 的新本地化和全球化特性?还是有更好的选择?我个人讨厌使用资源文件。它给代码增加了太多的混乱。
  2. 您是建议现在只使用平面文本,然后将国际化功能添加到网站,还是现在开始只添加翻译?

【问题讨论】:

  • 视情况而定。根据我对 SPA(Angular) 的经验,我总是这样做:1)创建资源文件。 2)当用户打开网站时 - 我将所有资源作为字典加载到 javascript 3)在页面上我从字典中写入 KEY。如果用户将更改语言 - 你只需要在 javascript 中替换字典。

标签: asp.net asp.net-mvc localization internationalization globalization


【解决方案1】:

我会使用资源文件,这似乎是最简单的解决方案。您还可以使用数据库资源提供程序,从而减少混乱。

如果从纯文本开始,以后添加翻译会变得更加复杂和麻烦。所以我不会那样做。

【讨论】:

  • 感谢您的回答。还有一个问题,您是否建议从 cookie/用户设置或 URL 中读取本地化信息?一些网站使用 URL 来表示语言,例如:somesite.com/en-US/controller/action
  • 我们有两种方法:对于我们这边的公共部分,我们按照您的建议在 URL 中使用它。从 SEO 的角度来看,这很有意义。如果有人看到一个英文页面,将 URL 转发给朋友,然后他得到一个德文页面,你也会得到奇怪的结果。如果他为相同的 URL 获得潜在的不同结果,Google 通常不喜欢它。对于私人(登录)部分,我们使用用户设置。
【解决方案2】:

我们使用Smart internationalization for ASP.NET

特点

  • 本地化所有内容:HTML、Razor、C#、VB、JavaScript、.NET 属性 和数据注释,...;
  • SEO 友好:语言选择会改变 URL,并且 Content-Language 设置适当;
  • 自动:应用中无需更改 URL/路由;
  • 高性能、最小开销和最小堆分配;单元测试支持;
  • 智能:根据 i18n 最佳实践,知道何时握住、折叠、走开或奔跑。

我如何在项目中逐步使用i18n:

  1. 将 I18N nuget 包添加到您的 MVC 项目中。

  2. 在 Web.config 中:

  3. 将名为“locale”的文件夹添加到站点的根目录。为您希望支持的每种文化创建一个子文件夹。例如,/locale/fr/。

  4. 将 i18n.PostBuild.exe 复制到语言环境文件夹中

  5. 右键单击项目名称 --> 属性 --> 构建事件: 在构建后事件命令行中:

"$(TargetDir)i18n.PostBuild.exe" "$(ProjectDir)\web.config"

  1. 在视图中使用[[[some text]]] 稍后翻译它

  2. 构建项目

  3. 刷新解决方案资源管理器并推送显示所有文件

  4. 将“locale”文件夹中的所有文件包含到项目中

  5. 提供 locale\fr\messages.po 中单词的翻译

  6. 在 Global.aspx 中添加:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //other app start code
        UrlLocalizer.UrlLocalizationScheme = UrlLocalizationScheme.Void;
    }
}
  1. 创建默认控制器:
public class DefaultController : Controller
{   
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (Session["currentLanguage"] == null)
        {
            Session["currentLanguage"] = "en";
        }
     }    
}
  1. 在 HomeController 中添加 DefaultController 和 SwitchLanguage(string lang) 的继承:
public class HomeController : DefaultController
{
    public HomeController() : base()
    { 
        [AllowAnonymous]
        public async Task<ActionResult> SwitchLanguage(string lang)
        {
            LocalizedApplication.Current.DefaultLanguage = lang;
            Session["currentLanguage"] = lang;
            return Redirect(Request.UrlReferrer.PathAndQuery);
        }
    }
}
  1. 在导航栏视图(在我的例子中为_LoginPartial.cshtml)添加链接以在语言之间切换:
        @if (Session["currentLanguage"].ToString() == "fr")
        {
            <li class="navItem">@Html.ActionLink("EN", "SwitchLanguage", "Home", new { lang = "en", area = "" }, null)</li>
        }
        else
        {
            <li class="navItem">@Html.ActionLink("FR", "SwitchLanguage", "Home", new { lang = "fr", area = "" }, null)</li>
        }

构建项目,在浏览器中启动并享受!!!

请参阅以下方面的帮助: https://www.codeday.top/2017/09/19/42409.html

【讨论】:

  • 我尝试使用 currentLanguage 会话,但没有任何线索
猜你喜欢
  • 2010-09-10
  • 2017-12-09
  • 2010-12-21
  • 2011-09-07
  • 1970-01-01
  • 2019-06-08
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多