【问题标题】:ASP .NET Core 2 Localization get all string for new languageASP .NET Core 2 本地化获取新语言的所有字符串
【发布时间】:2018-07-10 05:01:35
【问题描述】:

有一个本地化为 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization 的 ASP .NET Core 应用程序。

所有字符串都使用默认语言进行本地化,带有 IStringLocalizer _localizer["About Title"] - 没有 .resx 文件。

现在我想添加一种新语言。

我可以自动生成所有资源文件吗?

我的例子

private readonly IStringLocalizer<SharedResource> _localizerG;
private readonly IStringLocalizer<HomeController> _localizerC;

_localizerG["Your contact page. (G)"]
_localizerC["Your contact page. (C)"]

我可以为新的语言 uk-UA 生成(并在将来更新)带有填充字符串的 .resx 文件

  1. SharedResource.uk-UA.resx
    • 名称:您的联系页面。 (G)
    • 值:您的联系页面。 (G)
  2. HomeController.uk-UA.resx
    • 名称:您的联系页面。 (C)
    • 值:您的联系页面。 (C)

【问题讨论】:

  • 您可以通过创建自定义本地化程序来记录这些字符串。然后您可以为这些字符串创建所需的资源。
  • 如果所有代码路径都被实际调用,它们将被记录下来。我个人的看法是,官方推荐的在代码中使用完整默认值(而不是合成键)的 ASP.NET MVC 模式非常糟糕,并且一旦添加第二语言就会导致问题。

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


【解决方案1】:

作为一个选项,您可以通过创建自定义本地化程序来记录这些字符串。然后您可以为这些字符串创建所需的资源。

例如,像这样创建一个本地化器:

using Microsoft.Extensions.Localization;
public class MyStringLocalizer<T> : StringLocalizer<T>
{
    public MyStringLocalizer(IStringLocalizerFactory factory) : base(factory)
    {
    }

    public override LocalizedString this[string name]
    {
        get
        {
            //Log typeof(T) and name
            return base[name];
        }
    }

    public override LocalizedString this[string name, params object[] arguments]
    {
        get
        {
            //Log typeof(T) and name
            return base[name, arguments];
        }
    }
}

然后在ConfigureServices方法中,注册localizer:

services.AddTransient(typeof(IStringLocalizer<>), typeof(MyStringLocalizer<>));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2011-11-19
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多