我写了一篇博文,讨论了多语言 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 应用程序。使用资源翻译您的文本,它们可以在运行时快速交换。你有多个编辑器可以打开那些你可以传递给翻译等的编辑器。
您可以查看博客文章并获取有关我如何执行此操作的详细示例。