多语言MVC 4应用程序

17 c# asp.net-mvc localization asp.net-mvc-4

我正在创建一个新的应用程序,我想在一开始就做好,所以我可以在将来成长.

我已经看过几个指导如何制作多语言支持的应用程序的指南,但我无法弄清楚要使用的女巫.

有些教程很旧,我不知道它们是否已经过时了.

http://www.codeproject.com/Articles/352583/Localization-in-ASP-NET-MVC-with-Griffin-MvcContri http://geekswithblogs.net/shaunxu/archive/2012/09/04/localization-in -asp.net-mvc-ndash-upgraded.aspx http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx http://www.chambaud.com/2013/02/27/localization-in-asp-net -mvc-4/ https://github.com/turquoiseowl/i18n

我发现它们有两种存储语言数据的方式,无论是在db还是在资源文件中.有什么利弊?还有另一种方式是首选吗?

这就是我要的:

  1. 易于维护(添加/更改/删除)
  2. 全语言支持.(观点,货币,时间/日期,jquery,注释等......)
  3. 启用更改语言.
  4. 自动检测语言.
  5. 未来安全.

这样做的首选方式是什么?有什么好的教程是2013年的最佳实践吗?

Dom*_*rre 13

写了一篇博文,汇集了多语言asp.net mvc应用程序的以下方面:

数据库:我将表分成两部分,一部分包含不可翻译的字段,另一部分包含需要翻译的字段.

Url Routes:我通常将文化保留在URL中,以便获得索引良好的ML站点.

routes.MapRoute(
  name: "ML",
  url: "{lang}/{controller}/{action}/{id}",
  defaults: new { lang = "en-CA", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

从基本控制器类中,您可以使控制器可以使用{lang}参数.有关所有详细信息,请参阅博文.

查询数据:您只需将Culture传递到存储库或数据库上下文.我们的想法是创建一个视图模型,合并您分离的两个表以进行翻译.

public ActionResult Index(string id)
{
    var vm = pages.Get(id, Language); // Language is the {lang} from the route
    return View(vm);
}
Run Code Online (Sandbox Code Playgroud)

您的视图:使用.NET资源文件和通用的双字母语言代码,例如:HomePage.en.resx,HomePage.fr.resx.区域设置en** - US**,en** - CA**可用于格式化货币,日期,数字等.您的资源文件对于英语美国,加拿大等大多可能是相同的.

图像:使用imagename-en.png,imagename-fr.png等格式.在您的视图中,通过扩展方法使{lang} route参数可用,并显示如下图像:

<img src="/content/logos/imagename-@this.CurrentLanguage()" />
Run Code Online (Sandbox Code Playgroud)

您可能还有一个完整的单独文件夹,支持您的语言.示例:/content/en/imagename.png,/content/fr/imagename.png.

JavaScript ::我通常创建一个文件夹名称LanguagePacks和JS文件,名为Lang-en.js,Lang-fr.js.我们的想法是创建"静态"类,您可以在其他JS文件中使用它:

// lang-en.js
var Lang = {
  globalDateFormat = 'mm-dd-yy';
  greeting: 'Hello'  
};
Run Code Online (Sandbox Code Playgroud)

在您的视图上,您​​加载正确的语言文件

<script type="text/javascript" src="/content/js/languagepacks/lang-@(this.CurrentLanguage()).js"></script>
Run Code Online (Sandbox Code Playgroud)

来自JavaScript模块

// UI Module
var UI = function() {

  function notify() {
    alert(Lang.greeting);
  }
  return {
    notify: notify
  }
};
Run Code Online (Sandbox Code Playgroud)

没有办法做多语言的网络应用程序.使用参数来翻译文本,可以在运行时快速交换.你有多个编辑器,可以打开那些你可以传递给翻译等的编辑器.

您可以查看博客文章并获取有关我如何执行此操作的详细示例.


Ami*_*aqi 1

我自己有一种基于数据库的方法,但它可能不适合大型应用程序。

我创建一个Translation表/实体来保存应该是多语言的标题和文本。

因此,每当我想要渲染视图时,首先我从数据库检索适当的翻译,然后将其作为模型传递给视图:

var t = dbCtx.Translations.Find(langID);
// ...
return View(t);
Run Code Online (Sandbox Code Playgroud)

在视图中,我呈现如下内容:

<tr>
    <td>@Html.DisplayFor(m => m.WelcomeMessage)</td>
    <td>@Url.Action(Model.EnterSite, "Index", "Home")</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

为了获得适当的答案,你有几种方法。您可以使用会话:

Session["Lang"] = "en";
// ...
var lang = (string)Session["Lang"] ?? "en";
Run Code Online (Sandbox Code Playgroud)

或者通过查询字符串或它们的组合传递它。

对于自动检测语言,您应该做出以下决定:

a) 从浏览器检测

b) 检测用户IP并猜测他/她的地理位置并为他/她设置合适的语言