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

如何从Blazor组件同目录的资源文件中获取本地化字符串

Blazor组件同目录资源文件本地化实现方案

一、配置资源文件属性

确保你的TasksManagementPage.en.resx、TasksManagementPage.ja.resx资源文件满足以下设置:

  • 生成操作:设为Embedded Resource
  • 自定义工具:若需强类型类则设为PublicResXFileCodeGenerator,否则用ResXFileCodeGenerator
  • 命名空间:与TasksManagementPageContent组件所在命名空间保持一致(可在资源文件属性窗口修改)

二、使用IStringLocalizer实现本地化(官方推荐)

Blazor的IStringLocalizer会自动适配当前文化加载对应资源,完美支持同目录资源文件的场景。

1. 配置项目本地化服务

在Program.cs中添加本地化相关配置:

builder.Services.AddLocalization(options => options.ResourcesPath = ""); // 空字符串表示从组件目录加载资源

// 注册支持的语言文化
var supportedCultures = new[] { "en", "ja" };
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    options.DefaultRequestCulture = new RequestCulture("en");
    options.SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList();
    options.SupportedUICultures = options.SupportedCultures;
});

// 启用请求本地化中间件
app.UseRequestLocalization();

2. 修改组件代码

逻辑部分:

using Microsoft.Extensions.Localization;

public partial class TasksManagementPageContent : ComponentBase
{
    // 注入IStringLocalizer,泛型参数对应资源文件的基类名
    [Inject]
    private IStringLocalizer<TasksManagementPage> Localizer { get; set; } = null!;

    private TaskManager taskManager = null!;
  
    private void beginInputOfNewTaskData()
    {
        this.taskManager.beginInputNewTaskData();
    }
  
    private async Task onNewTaskEditingCompleted(CommonSolution.Gateways.ITaskGateway.Adding.RequestData requestData)
    {
        BlockingLoadingOverlayService.displayBlockingLoadingOverlay();

        try
        {
            await TasksSharedState.addTask(requestData);
        }
        catch (Exception exception)
        {
            _ = SnackbarService.displaySnackbarForAWhile(
                message: Localizer["Snackbar-TaskAddingFailed"],
                decorativeVariation: Snackbar.StandardDecorativeVariations.error
            );

            Debug.WriteLine(exception);
            return;
        }
        finally
        {
            BlockingLoadingOverlayService.dismissBlockingLoadingOverlay();  
        }

        this.taskManager.utilizeTaskEditing();
    
        _ = SnackbarService.displaySnackbarForAWhile(
            message: Localizer["Snackbar-TaskHasBeenAdded"],
            decorativeVariation: Snackbar.StandardDecorativeVariations.success
        );
    }
}

模板部分:

<TaskManager 
  onInputtingDataOfNewTaskComplete=@onNewTaskEditingCompleted
  @ref=@taskManager
/>

<ModalDialog
  title="@Localizer["FilteringModalDialog-Title"]"
  onInitializedEventCallback=@onTasksFilteringModalDialogInitialized
>
  <TasksFilteringPanel />
</ModalDialog>

三、备选方案:强类型资源类访问

如果偏好直接通过类属性访问字符串,可按以下操作:

  1. 确保资源文件的自定义工具设为PublicResXFileCodeGenerator,生成公共的TasksManagementPage类
  2. 在组件中直接使用该类:
// 逻辑部分
private readonly TasksManagementPage StaticStrings = new TasksManagementPage();

// 使用示例:StaticStrings.Snackbar_TaskAddingFailed

注意:强类型类会自动将资源名称中的短横线转为下划线,比如FilteringModalDialog-Title对应StaticStrings.FilteringModalDialog_Title

关键注意事项

  • 资源文件的基名称(TasksManagementPage)必须与生成的类名一致,且和组件处于同一目录
  • 使用IStringLocalizer时无需手动实例化资源类,框架会自动处理语言切换
  • 务必保证资源类与组件的命名空间一致,避免访问权限问题

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:25:03