搬运自OpenMod官网,经过翻译,可能有些不足,欢迎指正!原文链接
本地化
本地化允许用户自定义和翻译插件消息。
这是通过translations.yaml文件和IStringLocalizer服务。
plugins.csproj文件中的<RootNamespace>和<AssemblyName>属性必须相等,否则IStringLocalizer服务将无法工作。
添加translations.yaml
创建名为“translations.yaml”的新文件在项目的根目录中。
之后,将以下内容添加到.csproj文件中:
<ItemGroup>
<EmbeddedResource Include=“translations.yaml” />
</ItemGroup>
如果您使用其中一个模板创建插件项目translations.yaml文件将被设置。
使用IStringLocalizer进行本地化
假设要本地化以下命令:
[Command("awesome")] public class AwesomeCommand : Command { public AwesomeCommand(IServiceProvider serviceProvider) : base(serviceProvider) { } public async Task OnExecuteAsync() { var amount = Context.Parameters.Get<int>(0); await PrintAsync($"{Actor.DisplayName} is {amount}x awesome!"); } }
调整命令以使用IStringLocalizer服务:
[Command("awesome")] public class AwesomeCommand : Command { private readonly IStringLocalizer m_StringLocalizer; public AwesomeCommand( IStringLocalizer stringLocalizer, // 注入IStringLocalizer服务 IServiceProvider serviceProvider) : base(serviceProvider) { m_StringLocalizer = stringLocalizer; } public async Task OnExecuteAsync() { var count = Context.Parameters.Get<int>(0); // 打印本地化消息。 await PrintAsync(m_StringLocalizer["commands:awesome", new { Actor = Actor, Amount = amount }]); } }
commands:awesome定义翻译的关键。IStringLocalizer服务使用键作为yaml文件中值的路径。可以使用任何有效路径作为键,例如messages:awesome,同样awesome。
new { Actor = Actor, Amount = amount }设置消息的参数。
将翻译添加到translations.yaml:
commands: awesome: "{Actor.DisplayName} is {Amount}x awesome!"
注意我们如何通过调用Actor.DisplayName. IStringLocalizer使用SmartFormat.NET用于分析参数。有关详细信息,请访问SmartFormat.NET wiki。