如何在 UWP 应用程序 (.NET) 中本地化富文本?

How do I localize Rich text in UWP Application (.NET)?

我有一个多语言 UWP 应用程序,我需要本地化一些包含格式样式的文本。

例如我可以有这个文本块:

<textblock x:Uid="MyText">
 <Bold>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer leo turpis, rhoncus ac libero maximus, lacinia eleifend sapien.</Bold><LineBreak/> <Italic> Aenean pulvinar eros <Underline>sit amet sodales eleifend.</Underline></Italic> <LineBreak/><Bold>Aliquam feugiat sit amet risus ac venenatis.<LineBreak/> Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.<Bold><LineBreak/><Hyperlink NavigateUri="https://whosebug.com"> Fusce fermentum eleifend leo non pulvinar.</Hyperlink> 
</textblock>

为了本地化文本块,我创建了一个 "MyText.Text" 记录是 resw 文件,但问题是我无法将 xaml 放入 resw.

有一种方法或模式可以在 .NET/UWP?

中本地化富文本

无法使用 Uid 自动本地化格式化 XAML,但可以通过 C# 代码从 .resw 文件加载动态 XAML。

例如,在 resw 中,我的键 MY_FORMATTED_XAML 具有以下值:

    <Span Name="SPAN_NAME" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
      <Run>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sodales augue sit amet eros cursus, vitae tincidunt velit dictum. Vivamus in dolor sapien. Nunc ac dictum nulla.</Run>
      <LineBreak/>
      <Run Text="------------"/>
      <LineBreak/>
       <Run>
         Ut mollis massa ut tortor commodo cursus. Etiam at nisl eu lectus ornare iaculis. Sed consequat dignissim sapien, a tincidunt dolor rutrum at. Suspendisse accumsan eget ante ac aliquet. Nulla non dictum nisi. Nam ultrices libero ut orci pretium, finibus mollis mauris varius. Duis suscipit sapien cursus sagittis blandit. Donec hendrerit varius facilisis.                                                        
       </Run>
       <LineBreak/>
       <LineBreak/>
       <Run>
          <Bold>This is a sample for Whosebug</Bold>
       </Run>      
       <LineBreak/>      
       <Run>      
           Nunc mollis porttitor arcu ac mattis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed lacinia mattis enim, a tincidunt nisi. Quisque accumsan, sapien quis fringilla pharetra, purus metus maximus velit, ac aliquam enim justo et ante. Aliquam malesuada at velit vel consequat.                
       </Run>&#160; 
<Italic>License:</Italic>
       <Hyperlink NavigateUri="http://unlicense.org">Unlicense 2016.</Hyperlink>
       <LineBreak/>

    </Span>

在 c# 中,我有一个助手 class 来加载资源字符串:

public static class ResourceRetriever
{
    private static ResourceMap _resourceMap = null;
    public static ResourceMap ResourceMap
    {
        get
        {
            if (_resourceMap == null)
            {
                _resourceMap=  Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap;                    
            }
            return _resourceMap;
        }
    }

    public static string GetString(string key)
    {
        return ResourceMap?.GetValue("Resources/" + key, new ResourceContext())?.ValueAsString;
    }

    public static string GetString(string key, ResourceContext context)
    {
        return ResourceMap?.GetValue("Resources/"+key, context)?.ValueAsString;
    }
}

然后我使用此代码加载动态 xaml:

String dynamicXaml = ResourceRetriever.GetString("MY_FORMATTED_XAML");
Span span = XamlReader.Load(dynamicXaml) as Span; 
this.MyTextBlock.Inlines.Add(span);