首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >多语言MVC 4应用程序

多语言MVC 4应用程序
EN

Stack Overflow用户
提问于 2013-08-25 23:34:31
回答 4查看 17.3K关注 0票数 17

我现在正在创建一个新的应用程序,我想在一开始就做得很好,这样我就可以在未来与它一起成长。

我看过一些指南,介绍如何制作一个支持多语言的应用程序,但我不知道该用哪一个。

有些教程很旧,我不知道它们是不是过时了。

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

我发现它们是两种存储语言数据的方式,要么是在数据库中,要么是在资源文件中。赞成/反对的是什么?有没有其他更好的方式呢?

这就是我想要的:

(Add/Change/Remove)

  • Full语言支持
  1. 易于维护。(视图、货币、时间/日期、jquery、注解等)
  2. 允许更改和检测language.
  3. Future

做这件事的首选方法是什么?有没有什么好的教程是2013年的最佳实践?

EN

回答 4

Stack Overflow用户

发布于 2013-11-29 21:40:43

我对多语言asp.net mvc应用的以下几个方面进行了written a blog post转换:

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

网址路由:我通常会保留网址中的文化,这样你就可以得到一个索引良好的ML站点。

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

从一个基本的控制器类中,你可以使{lang}参数对你的控制器可用。有关详细信息,请参阅博客文章。

查询您的数据:您只需将区域性传递到您的存储库或数据库上下文。其思想是创建一个视图模型,该模型合并您为转换而分离的两个表。

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

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

imagename图像:使用类似-en.png、imagename-fr.png的格式。在您的视图中,通过扩展方法使{lang}路由参数可用,并像这样显示您的图像:

<img src="/content/logos/imagename-@this.CurrentLanguage()" />

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

我通常创建一个名为LanguagePacks的文件夹和名为Lang-en.js、Lang-fr.js的JS文件。这个想法是创建可以在其他JS文件中使用的“静态”类:

// lang-en.js
var Lang = {
  globalDateFormat = 'mm-dd-yy';
  greeting: 'Hello'  
};

在视图中,您加载了正确的语言文件

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

从JavaScript模块

// UI Module
var UI = function() {

  function notify() {
    alert(Lang.greeting);
  }
  return {
    notify: notify
  }
};

没有一种方法可以做一个多语言的web应用。使用参考资料来翻译您的文本,它们可以在运行时快速交换。你有多个编辑器,可以打开那些你可以传递给translator等的编辑器。

你可以查看博客文章,并获得我如何做到这一点的详细示例。

票数 13
EN

Stack Overflow用户

发布于 2013-08-26 17:42:31

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

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

因此,每当我想要呈现一个视图时,我首先从db检索适当的翻译,然后将其作为model传递给视图:

var t = dbCtx.Translations.Find(langID);
// ...
return View(t);

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

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

关于得到适当的答案,你有几种方法。您可以使用session:

Session["Lang"] = "en";
// ...
var lang = (string)Session["Lang"] ?? "en";

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

对于自动检测语言,您应该选择以下几项:

a)从浏览器检测

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-17 13:25:20

我有一种感觉,这个问题没有一个直接的答案。对于格式,你应该总是使用CultureUICulture,比如'en-GB‘代表英式英语,'en- US’代表美国英语(是的,这是有区别的)。所有的.Net都是围绕它构建的,这样你就可以使用本地格式,而不需要真正考虑它。

您还应该查看System.Globalization名称空间以获取更多详细信息:http://msdn.microsoft.com/en-us/library/system.globalization%28v=vs.110%29.aspx

至于文化应该来自哪里,那么至少在我们公司,策略总是没有例外地来自查询字符串。原因是,如果您使用IP本地化,例如,如果西班牙用户正在查看日本的西班牙语网站,然后将切换到日语版本,那么这并不完全错误,但如果您告诉客户这是一个直接的西班牙语链接或其他什么,那么可能会很烦人。也就是说,如果在查询字符串中没有定义区域性,那么使用IP来获取用户想要的语言的猜测将不是一个坏主意,但实际上取决于您的客户的需求。

至于如何获得翻译,这真的要看情况了,资源和数据库都有起伏。所以DB的主要优点是,它很容易在应用程序之间共享,如果您出于任何原因需要更新短语,那么您可以通过一个DB条目来更新它们,但这也可能是一个错误,因为一些短语具有双重含义,可以在其他语言中完全不同地翻译,尽管相同的句子在英语中使用。DB的另一个大问题是,在某种程度上(但这取决于实现),您在短语的VS中松散了智能。

资源当然有适当的智能,但它们对于您正在使用的web应用程序来说是相当静态的,您不能在应用程序之间共享资源……不完全正确,但或多或少你不能。尽管这种静态的性质也是一个优点,因为所有的资源都包含在应用程序中,你知道没有任何外部效果可以影响它。

实际上,这真的取决于手头的项目。你只需要选择你自己的利弊,自己决定……抱歉的。但如果有帮助的话,我可以告诉你我公司的情况。我们制作了几个应用程序,这些应用程序在不同的web应用程序中共享相同的短语。我们曾经在数据库中使用它,但发生的情况是翻译一直在进行数组,这意味着客户要求为一个应用程序提供更好的西班牙语翻译,但这对其他应用程序没有任何意义。这种情况的发生比你想象的要多。然后我们转到资源,但发生的情况是,当一个应用程序的翻译被更新时,没有人记得更新其他应用程序,实际上发生了3个不同的应用程序以3种不同的方式翻译相同的术语。最后,我们决定回到数据库,因为一次更改所有翻译的能力对我们来说更有意义,而事实上没有外部影响可以影响它。

一般来说,也有其他的优点和缺点,但所有这些与上面的相比都是相当不相关的。你真的需要问一下你是如何使用这些翻译的。至于一般的编辑(不包括上面这一点),那么aider方法同样适用,您可以使用这两种方法轻松地更改和编辑或扩展翻译。

也就是说,如果DB和DB调用的设计很糟糕,那么使用资源添加新的语言可能会更容易,只需复制资源文件,将区域性扩展添加到名称中,并将翻译添加到资源中,您就完成了,但同样,完全归结到DB设计,因此在设计DB时需要牢记这一点,并且对在DB中保存翻译几乎没有提及。

总的来说,我会说这些资源更容易使用,非常容易维护和扩展(它们已经内置到.NET中),尽管如果您需要共享翻译,DB有一个明显的优势。因此,如果我不得不说,我会说推荐的方式是使用资源,但DB确实有它的位置,它真的取决于项目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18430654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档