ASP.NET MVC中点击按钮动态加载资源文件实现多语言切换
实现ASP.NET MVC动态加载本地化资源文件的步骤
嘿,我来一步步教你搞定这个动态切换语言的需求,其实ASP.NET MVC用资源文件做本地化没那么复杂,咱们按步骤来:
1. 确认资源文件的正确配置
首先得确保你的资源文件命名和结构是对的:
- 英文资源文件:比如命名为
SharedResources.resx(这是默认的 fallback 资源) - 法语资源文件:命名为
SharedResources.fr.resx - 把这些文件放在项目根目录的
Resources文件夹里,然后右键每个资源文件,设置:- 生成操作:嵌入的资源
- 自定义工具:
PublicResXFileCodeGenerator(这个会生成public的资源类,方便视图和控制器访问) - 访问修饰符:在资源文件的设计界面顶部,把访问修饰符改成
Public(默认是internal,视图里访问不了)
2. 新增语言切换的Action
在你的HomeController里加一个处理语言切换的方法,把用户选择的语言存到Session里(也可以用Cookie实现持久化,下次打开网站还记得选择):
public ActionResult ChangeLanguage(string language) { // 把选中的语言存入Session Session["CurrentLanguage"] = language; // 重定向回首页(也可以重定向到用户之前浏览的页面,这里简化处理) return RedirectToAction("Index"); }
3. 全局设置当前线程的文化
创建一个BaseController让所有其他控制器继承,在请求执行前设置线程的UICulture和Culture,这样整个请求都会用选中的语言加载资源:
public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { // 从Session获取用户选择的语言 var currentLang = Session["CurrentLanguage"] as string; if (!string.IsNullOrEmpty(currentLang)) { var culture = new CultureInfo(currentLang); // 设置UI文化(决定加载哪个资源文件) Thread.CurrentThread.CurrentUICulture = culture; // 设置区域文化(影响日期、数字等格式,这里和UI文化保持一致) Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture.Name); } base.OnActionExecuting(filterContext); } }
然后让你的HomeController(以及其他所有控制器)继承这个BaseController:
public class HomeController : BaseController { // 你的原有Action代码... }
4. 在视图中使用本地化文本
现在你可以在视图里直接调用生成的资源类来获取对应语言的文本了,比如:
<h1>@SharedResources.WelcomeMessage</h1> <p>@SharedResources.HomePageDescription</p>
这里SharedResources是资源文件生成的类名,和你的基础资源文件名一致。
5. 首页添加语言切换按钮
在首页视图里添加切换按钮,调用刚才的ChangeLanguage Action:
方式一:用ActionLink
<div class="language-switcher"> @Html.ActionLink("English", "ChangeLanguage", "Home", new { language = "en" }, new { @class = "lang-btn" }) @Html.ActionLink("Français", "ChangeLanguage", "Home", new { language = "fr" }, new { @class = "lang-btn" }) </div>
方式二:用表单提交(适合按钮样式自定义)
@using (Html.BeginForm("ChangeLanguage", "Home", FormMethod.Post)) { <button type="submit" name="language" value="en" class="lang-btn">English</button> <button type="submit" name="language" value="fr" class="lang-btn">Français</button> }
测试验证
现在运行项目,点击法语按钮,Session里会存入fr,线程文化切换为法语,页面上的文本就会自动加载SharedResources.fr.resx里的内容了;点击英文按钮则切回英文资源。
内容的提问来源于stack exchange,提问作者KeTa16
相关产品推荐
相关产品推荐

