Расширение StaticResource
отлично работает для того, что вы пытаетесь достичь. С помощью StaticResource вы можете включить практически все, даже если DynamicResource не работает:
<Window ...>
<Window.Resources>
<Span x:Key="Whatever">
<Bold>Hello</Bold> there<LineBreak/>
A green circle:
<InlineUIContainer>
<Ellipse Width="10" Height="10" Fill="Green" />
</InlineUIContainer>
</Inline>
</Window.Resources>
...
<TextBlock>
<StaticResource ResourceKey="Whatever" />
</TextBlock>
Теперь локализовать это легко:
- Переместите ресурс
Span
в отдельный ResourceDictionary
и объедините его со словарем ресурсов вашего приложения.
- Во время запуска приложения и перед созданием каких-либо окон используйте код для получения текущей культуры и добавьте дополнительный язык
ResourceDictionary
к application.Resources.MergedDictionaries
. Спутниковый словарь можно загрузить с помощью встроенного в WPF механизма локализации.
Пока словари объединяются в словаре приложения в правильном порядке, любой именованный ресурс, найденный в локализованном словаре, будет иметь приоритет над ресурсом в главном словаре, например, ваша dll для испанской локализации может иметь xaml файл, содержащий это:
<ResourceDictionary>
<Span x:Key="Whatever">
El círculo rojo
<InlineUIContainer>
<Ellipse Width="10" Height="10" Fill="Red" />
</InlineUIContainer>
dice <Bold>hola!</Bold>
</Span>
</ResourceDictionary>
Обратите внимание, что сообщение похоже, но для испанского кружок красный, а расположение текста другое.
Вы можете сделать это намного дальше с ControlTemplates, если хотите. Использование ControlTemplates позволит вам делать такие вещи, как кнопки, расположенные в различном порядке в зависимости от локали. Например, если ваш общий словарь содержит:
<ResourceDictionary>
<ControlTempate x:Key="Something" TargetType="ContentControl">
<StackPanel>
<TextBlock Text="In English we want the text above the button" />
<ContentPresenter />
</StackPanel>
</ControlTemplate>
</ResourceDictionary>
Вы можете добавить это в свое окно или пользовательский элемент управления:
<ContentControl Template="{StaticResource Something}">
<Button Command="Save">Save File</Button>
</ContentControl>
А затем вы меняете раскладку на другой язык, например:
<ResourceDictionary>
<ControlTempate x:Key="Something" TargetType="ContentControl">
<DockPanel>
<ContentPresenter DockPanel.Dock="Left" />
<TextBlock Text="En español en el botón a la izquierda del texto" />
<!-- In spanish the button is to the left of the text -->
</DockPanel>
</ControlTemplate>
</ResourceDictionary>
Примечание. Если вы используете локализацию только в DependencyProperties (например, без InlineCollections и т. Д.), Вы можете обойтись без использования {DynamicResource}
, которое позволяет изменить локаль в любое время с мгновенным обновлением пользовательского интерфейса. Чтобы сделать это с моим первым примером, вместо включения <Span>
в ResourceDictionary
и включения его в TextBlock, вы можете поместить TextBlock в ControlTemplate внутри ResourceDictionary.
Это только начало гибкости локализации с WPF. Вы можете пойти гораздо дальше.