2016-09-18 6 views
1

У меня есть многоязычное приложение UWP, и мне нужно локализовать текст, который включает в себя стили форматирования.Как локализовать Rich Text в приложении UWP (.NET)?

Например, я могу иметь этот TextBlock:

<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://stackoverflow.com"> Fusce fermentum eleifend leo non pulvinar.</Hyperlink> 
</textblock> 

Чтобы локализовать TextBlock я создаю «MyText.Text» запись является RESW файл, но проблема в том, что я не могу поставить XAML в RESW.

Существует способ или шаблон для локализации богатого текста в .NET/UWP?

+0

[Глобализация и локализация] (https://msdn.microsoft.com/en-us/windows/ UWP/глобализирующемся/глобализирующемся-портал). – IInspectable

+0

@Inpectpect, я уже прочитал документацию, и я локализовал все строки, но я не могу локализовать форматированный текст. –

+0

Я не понимаю, почему форматирование будет иметь значение. Разве процесс не тот же (за исключением того, что вы не переводите директивы форматирования)? – IInspectable

ответ

0

Локализовать форматированный XAML автоматически с помощью Uid невозможно, но динамический XAML можно загрузить с помощью кода C# из .resw-файлов.

Например, в 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 stackoverflow</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# У меня есть вспомогательный класс для загрузки ресурсов строки:

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);