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

我发现它们是存储语言数据的两种方式,无论是在数据库中还是在资源文件中。有什么优点/缺点?还有另一种首选方式吗?

这就是我要的:

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

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

4

4 回答 4

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 }
);

从基本控制器类中,您可以使该 {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。

JavaScript::我通常创建一个文件夹名称为 LanguagePacks 和 JS 文件,分别称为 Lang-en.js、Lang-fr.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 应用程序。使用资源翻译您的文本,它们可以在运行时快速交换。你有多个编辑器可以打开那些你可以传递给翻译等的编辑器。

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

于 2013-11-29T13:40:42.740 回答
1

我有一个基于 db 的方法,但它可能不适合大型应用程序。

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

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

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["Lang"] = "en";
// ...
var lang = (string)Session["Lang"] ?? "en";

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

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

a) 从浏览器检测

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

于 2013-08-26T09:42:30.657 回答
1

我有点感觉这个问题没有一个直截了当的答案。对于格式和什么,您应该始终使用ie 之类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 种不同的方式翻译同一个术语。最后我们决定回到DB,

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

也就是说,如果 DB 和 DB 调用设计得不好,那么使用资源可以更轻松地添加新语言,只需复制资源文件,将文化扩展名添加到名称中,然后将翻译添加到资源中,就完成了,但是再次,完全取决于数据库设计,因此在设计数据库时要牢记这一点,并且几乎没有说明将翻译保存在数据库中。

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

于 2013-11-17T05:25:19.720 回答
0

我一直在寻找与您相同的资源以满足相同的需求,但正如您所说,很难找到一种首选的解决方案。

但我决定采用您在问题中链接的 Michael Chambaud 的解决方案。这样做的原因是它很容易实现,给了我想要的 url,因为我仍然不是 100% 确定......将来很容易替换。

除此之外,我将使用 jquery globalize 进行客户端格式化。

听到您决定采用什么解决方案真的很有趣?

于 2013-10-13T19:55:18.213 回答