如何本地化Piranha Headless CMS?实现语言切换展示对应页面
给Piranha Headless CMS配置双语言本地化方案(仅双页面展示)
Hey Karel, 针对你想要给Piranha Headless CMS做双语言本地化、支持用户选语言并展示对应页面的需求,我整理了一套轻量实操方案,不需要复杂的全球化功能,刚好适配你的场景:
1. 准备语言资源文件
首先你需要创建两套语言资源文件,用来存储导航栏、按钮文字这类通用固定文本:
- 在项目根目录新建
Resources文件夹 - 分别创建
Resources.en.resx(英文)和Resources.zh.resx(或你需要的另一套语言) - 在每个resx文件里添加键值对,比如:
- 键:
HomePage,英文值:Home,中文值:首页 - 键:
SwitchLanguage,英文值:Switch Language,中文值:切换语言
- 键:
- 记得把这两个文件的生成操作设置为
嵌入的资源(在文件属性面板里修改)
2. 配置本地化服务
在项目启动文件(Program.cs或Startup.cs)里添加本地化相关的服务配置:
// 添加本地化服务,指定资源文件路径 builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); // 配置请求本地化,设置支持的语言和默认语言 builder.Services.Configure<RequestLocalizationOptions>(options => { var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("zh") }; options.DefaultRequestCulture = new RequestCulture("en"); options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); // 注册本地化中间件(放在路由中间件之前) app.UseRequestLocalization();
3. 实现语言切换功能
你需要在页面上添加一个语言选择控件,用Cookie保存用户的语言偏好会比较方便:
- 在页面导航区添加下拉框或按钮组,比如用Razor语法实现:
<div class="language-switcher"> <form asp-action="SetLanguage" asp-controller="Home" method="post"> <select name="culture" onchange="this.form.submit()"> <option value="en" @(Context.Request.Cookies["Culture"] == "en" ? "selected" : "")>English</option> <option value="zh" @(Context.Request.Cookies["Culture"] == "zh" ? "selected" : "")>中文</option> </select> <input type="hidden" name="returnUrl" value="@Context.Request.Path" /> </form> </div>
- 然后在
HomeController里添加SetLanguage接口处理语言切换请求:
[HttpPost] public IActionResult SetLanguage(string culture, string returnUrl) { Response.Cookies.Append( CookieRequestCultureProvider.DefaultCookieName, CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)), new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) } ); return LocalRedirect(returnUrl); }
4. 页面内容的本地化展示
针对CMS里的动态页面内容,你不需要搭建全局多语言站点,只需要创建两套对应语言的页面:
- 在Piranha后台分别创建两个页面,比如
Home (en)(别名设为home-en)和Home (zh)(别名设为home-zh) - 在前端获取页面时,根据当前文化信息拼接页面别名:
var currentCulture = Thread.CurrentThread.CurrentCulture.Name; var pageAlias = $"home-{currentCulture}"; var page = await _api.Pages.GetByAliasAsync(pageAlias);
- 最后把获取到的页面内容渲染到对应模板即可
5. 通用文本的本地化调用
在视图或组件里,注入IStringLocalizer来调用资源文件里的文本:
@inject IStringLocalizer<Resources> Localizer <h1>@Localizer["HomePage"]</h1> <button>@Localizer["SwitchLanguage"]</button>
这样配置完成后,用户就能通过语言选择器切换语言,系统会根据用户选择加载对应的语言资源和CMS页面,完全满足你仅展示两套页面的需求~
内容的提问来源于stack exchange,提问作者Karel
相关产品推荐
相关产品推荐

