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还是在资源文件中.有什么利弊?还有另一种方式是首选吗?
这就是我要的:
这样做的首选方式是什么?有什么好的教程是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)
没有办法做多语言的网络应用程序.使用参数来翻译文本,可以在运行时快速交换.你有多个编辑器,可以打开那些你可以传递给翻译等的编辑器.
您可以查看博客文章并获取有关我如何执行此操作的详细示例.
我自己有一种基于数据库的方法,但它可能不适合大型应用程序。
我创建一个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并猜测他/她的地理位置并为他/她设置合适的语言
| 归档时间: |
|
| 查看次数: |
16890 次 |
| 最近记录: |