如何从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>
三、备选方案:强类型资源类访问
如果偏好直接通过类属性访问字符串,可按以下操作:
- 确保资源文件的自定义工具设为
PublicResXFileCodeGenerator,生成公共的TasksManagementPage类 - 在组件中直接使用该类:
// 逻辑部分 private readonly TasksManagementPage StaticStrings = new TasksManagementPage(); // 使用示例:StaticStrings.Snackbar_TaskAddingFailed
注意:强类型类会自动将资源名称中的短横线转为下划线,比如
FilteringModalDialog-Title对应StaticStrings.FilteringModalDialog_Title
关键注意事项
- 资源文件的基名称(
TasksManagementPage)必须与生成的类名一致,且和组件处于同一目录 - 使用
IStringLocalizer时无需手动实例化资源类,框架会自动处理语言切换 - 务必保证资源类与组件的命名空间一致,避免访问权限问题
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

