• 中文
  • 注册
  • 技术交流 技术交流 关注:4 内容:20

    [OpenMod]插件的本地化

  • 查看作者
  • 打赏作者
  • 当前位置: 未转变者中文社区 > 技术交流 > 正文
    • 1
    • 技术交流
    • 大版主
      Lv.13

      搬运自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

      Lv.1
      […] 避免像上面的例子那样对消息进行硬编码。相反,使用本地化,这样用户就可以定制和翻译消息。 […]
      回复

      请登录之后再进行评论

      登录
    • 发布内容
    • 任务中心
    • 实时动态
    • 偏好设置
    • 帖子间隔 侧栏位置: