Known 内置轻量多语言(不是资源文件、不是 ResX),核心机制是 LocalService 键值词典。
营销站这类静态 SSR 场景另有单独策略,见 §静态站怎么办。
词典与语言项
LocalService 维护:
public class LocalService
{
public LanguageInfo Info { get; } // 当前语言、是否深色
public event Action Changed; // 语言/主题变化广播
public string T(string key) // 取键值;缺失回落 key 本身
public string T(string key, params object[] args)
public Task SetLanguageAsync(string code) // zh-CN / en-US / ja-JP
public Task ToggleThemeAsync()
}
语言项按程序集扫描:模块里带 [LangItem] 的类返回 Dictionary<string, string>,
Known 把它们合并进当前语言的词典表。已预留 zh-CN / en-US / ja-JP 三项。
组件里用
@inject LocalService Local
<h1>@Local.T("Order.Title")</h1>
<p>@Local.T("Order.CreateTime", order.CreatedAt)</p>
切换语言:
await Local.SetLanguageAsync("en-US");
调用后广播 Changed 事件,页面里凡是订阅了 Changed 的组件都会 StateHasChanged。
持久化
当前语言与主题一起写入 localStorage('known-lang') 与 localStorage('known-theme')。
用户下次访问自动带上偏好。首屏 pre-paint 脚本读 known-lang 决定 <html lang>。
静态站怎么办
Website 是零交互 SSR,没有 LocalService 可用(那是 Known 框架运行时的一部分)。
营销站当前只中英混合的中文一版;未来若真要双语:
- 路由前缀化:
/docs/...(默认 zh)与/en/docs/...(英文); - 语言切换用
<form action="/en{currentPath}" method="get">原生提交,服务端按前缀切词典; appsettings里加Site:DefaultLang,Canonical 决定默认。
这一整套归 WS 系下一轮,未列入 Batch 2 之前。
有意不做
- 复数与性别语法:
{count, plural, one {...} other {...}}那套 ICU MessageFormat 太重, 当前只支持string.Format风格。 - 服务端渲染时的语言协商(
Accept-Language):Known 目前只在客户端切,不重定向; 营销站若上双语会加此逻辑。
扫码关注公众号
扫码加入 QQ 群