【问题标题】:How to add a changing property to an already existing property in Blazor?如何将更改的属性添加到 Blazor 中已存在的属性?
【发布时间】:2021-06-11 09:31:06
【问题描述】:

我正在 Blazor 应用程序中构建语言更改功能。到目前为止我有的是这个,这是一个例子:

@page "/example"
@using Blazorserver.Languages
@inject Languages.Dutch dutch
@inject Languages.English english


<p>@dutch.VoorPagina</p> 

<button @onclick="LanguageSwitcher"></button>



@code {
    public static string language = "dutch";
            
    private void LanguageSwitcher()
    {
        if (language == "dutch")
        {
            language = "english";
        }
        else
        {
            language = "dutch";
        }
    }

}

我特别要寻找的是在上述示例(&lt;p&gt;@dutch.VoorPagina&lt;/p&gt;)中的&lt;p&gt; 标签之间有一个变化的值。 "VoorPagina" 是来自另一个文件的字符串,在此处注入。我希望能够将“荷兰语”部分更改为“英语”,以便将相同的字符串更改为不同的语言。我尝试了@@dutch.VoorPagina 之类的方法,因此荷兰语是一个可以更改的变量,但这显然不起作用。有没有办法做到这一点?

【问题讨论】:

  • 最好使用本地化服务。这是一个sample project,它使用支持在线翻译的自定义本地化nuget。

标签: c# html asp.net-core blazor


【解决方案1】:

我擅长 C#,但我没有任何使用 Blazor 的经验。 主要有两个问题:

  1. 调用该方法。在常规 C# 中,必须调用方法才能运行。那里 必须是入口点。您确定 Blazor 会调用此方法吗?如果没有,那么你 需要一个入口点。 (即在常规 C# 中):
// This is an entry point in regular C#
using System;

class Program {
   static void Main(string[] args) {
      // Any code here will run
   }
}

在统一中:

// An entry point in Unity
using UnityEngine;

class Program : MonoBehavior{
   void Start() {
      // Any code here will run
   }
}

我不确定,但你的方法很可能不会被调用,考虑写一个入口点(例如 Main)

  1. 即使你写了一个入口点,它也只会输出“荷兰语”。简单地说,如果方法 被调用,它只会在程序开始时运行一次。你会需要 a 在入口点写一个while循环,记住在中间加一些时间 不会使程序崩溃的迭代。

我从未听说过 Blazor,这可能不是 100% 正确的。谢谢!

编辑:修改代码后,我注意到如果单击按钮,该方法将运行。问题一和二解决了。我认为您必须打印这些语言,以便了解它们的价值。

第二次编辑: 我认为代码没有问题,可能是 Blazor 本身的问题,也可能是命名空间 'Dutch' 和 'English' 的问题。

【讨论】:

    【解决方案2】:

    我会考虑将特定语言的 UI 文本移动到资源文件中并使用标准本地化,例如 IStringLocalizer&lt;Index&gt; localizer

    这里是detailed tutorial 操作方法。

    或者试试this。这看起来很有希望,但我没有尝试过。

    【讨论】:

      【解决方案3】:

      试试这个。我认为这基本上就是你想要做的:

      (1) 在单独的代码文件中添加具有多个实现的接口。在实际应用中,我会为每种语言创建一个单独的文件:

      LanguageInterface.cs

      namespace MyLanguages
      {
          enum Languages { English, Dutch }
          interface ILanguage
          {
              string Hello { get; }
              string GoodBye { get; }
          }
          class EnglishLanguage : ILanguage
          {
              public string Hello { get; } = "Hello";
              public string GoodBye { get; } = "GoodBye";
          }
          class DutchLanguage : ILanguage
          {
              public string Hello { get; } = "Hallo";
              public string GoodBye { get; } = "Vaarwel";
          }
      }
      

      (2) 然后实例化接口用你想激活的任何类:

      Main.razor

      @using MyLanguages
      
      <h3>Language Selector</h3>
      
      <button @onclick="@(() => ChangeLanguage(Languages.English))">English</button>
      <button @onclick="@(() => ChangeLanguage(Languages.Dutch))">Dutch</button>
      
      @if(CurrentLanguage != null)
      {
          <div>@CurrentLanguage.Hello</div>
          <div>@CurrentLanguage.GoodBye</div>
      }
      @code {
          ILanguage CurrentLanguage { get; set; }
      
          void ChangeLanguage (Languages languageSelection)
          {
              switch (languageSelection)
              {
                  case Languages.English:
                      CurrentLanguage = new EnglishLanguage();
                      break;
                  case Languages.Dutch:
                      CurrentLanguage = new DutchLanguage();
                      break;
              }
          }
      }
      

      (免责声明:最好查找 Blazor 的本地化实践,然后按照它们进行操作!)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2013-09-02
        相关资源
        最近更新 更多