多语言

LocalService 键值词典与语言持久化,一套界面面向多语言用户的机制。

最后更新

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 交流群二维码 扫码加入 QQ 群