You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发布ASP.NET Core应用后Portable Object本地化功能失效

解决ASP.NET Core PO本地化发布后失效的问题

我在使用ASP.NET Core框架,采用Portable Object(PO)本地化方案。本地化功能在开发环境中运行正常,但将Web应用发布到文件夹后,该功能失效。我配置了ps(普什图语)、en(英语)、prs-Af(阿富汗达利语)三种本地化语言,发布后生成的文件夹结构如下:

发布文件夹根目录下有ps、en、prs-Af三个子文件夹,每个子文件夹里对应存放着.po本地化文件。

其中一个PO文件的属性信息显示:

该文件的「复制到输出目录」属性设为「如果较新则复制」,「生成操作」为「内容」。

问题排查与解决步骤

1. 修正PO文件的发布复制规则

开发环境会直接读取项目目录里的文件,但发布时如果复制规则不合理,PO文件可能没被正确部署。

  • 打开项目中所有PO文件的属性,把复制到输出目录改成始终复制,避免因文件未更新导致发布时遗漏。
  • 保持生成操作为内容,确保发布系统识别这是需要部署的资源文件。

2. 检查本地化服务配置

确认Program.cs(或Startup.cs)里的本地化服务配置,要正确指向PO文件路径:

builder.Services.AddLocalization(options => options.ResourcesPath = ""); // PO文件直接在语言子文件夹下时,ResourcesPath设为空
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("ps"),
        new CultureInfo("en"),
        new CultureInfo("prs-Af")
    };
    options.DefaultRequestCulture = new RequestCulture("en");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;
});

// 注册PO本地化提供器
builder.Services.AddSingleton<IStringLocalizerFactory, PortableObjectStringLocalizerFactory>();

注意:如果PO文件是放在项目根目录的语言子文件夹中,ResourcesPath必须设为空字符串,不然会多一层路径前缀,导致程序找不到文件。

3. 验证发布后的文件完整性

发布完成后,检查目标文件夹里每个语言子文件夹下的PO文件是否完整存在,内容和项目里的源文件是否一致。如果文件缺失或内容不对,重新发布时勾选「删除目标文件夹中的现有文件」,确保完全覆盖旧文件。

4. 确认运行时文化切换逻辑

要保证应用能正确读取请求里的文化信息(比如URL参数、Cookie或请求头),也可以在代码里显式设置文化:

var culture = new CultureInfo("ps");
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;

可以在页面加调试代码,输出当前的CurrentUICulture.Name,确认应用是否正确切换到目标文化。

5. 校验PO文件格式

检查PO文件是否符合标准格式:

  • 每个条目都有正确的msgid和msgstr
  • 文件编码为UTF-8(避免乱码或读取失败)
  • 没有语法错误(可以用PO文件校验工具检查)

内容的提问来源于stack exchange,提问作者Najeeb Anwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:31:01