В настоящее время я борюсь с каким-то особым случаем в локализации. Я читал о различных подходах к локализации приложения WPF и решил пойти со спутниковыми сборками, созданными "locbaml". Чтобы иметь возможность локализовать строки из С# -code, я решил использовать ресурсные словари, как описано здесь: http://msdn.microsoft.com/en-us/library/bb613547%28v=vs.110%29.aspx
Итак, у меня есть этот словарь ресурсов:
<ResourceDictionary x:Uid="ResourceDictionary_1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">
<system:String x:Uid="system:String_1" x:Key="TestKey">Development</system:String>
</ResourceDictionary>
Я объединять его в app.xaml:
Application x:Uid="Application_1" x:Class="LocalizationIssue.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary x:Uid="ResourceDictionary_1">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Uid="ResourceDictionary_2" Source="Localization.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Это должно позволить мне сделать что-то вроде этого:
this.Message = (string)Application.Current.FindResource("TestKey");
И это так. Когда я запускаю приложение, я вижу "Разработка". Мой образец проекта имеет только два текстовых блока. TextProperty одного TextBlock привязан к свойству, называемому "Message". Другой устанавливается статически на "StaticDevelopment". Итак, MainWindow.xaml выглядит так:
<Window x:Uid="Window_1" x:Class="LocalizationIssue.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel x:Uid="StackPanel_1">
<TextBlock x:Uid="TextBlock_1" FontSize="20" Text="{Binding Message}" VerticalAlignment="Center" HorizontalAlignment="Center" />
<TextBlock x:Uid="TextBlock_2" FontSize="20" Text="StaticDevelopment" VerticalAlignment="Center" HorizontalAlignment="Center" />
</StackPanel>
</Window>
Затем я выполнил все шаги для создания спутниковых сборок с помощью locbaml, как описано здесь: http://msdn.microsoft.com/en-us/library/ms746621%28v=vs.110%29.aspx
т.е.: 1. Добавьте UICulture в файл проекта (а также в сборкуinfo)
2. Создайте uids: msbuild/t: updateuid LocalizationIssue.csproj
3. Создайте csv файл: locbaml/parse LocalizationIssue.resources.dll/out:loc.csv
4. Перевести значения в loc.csv
5. Создайте sattelites: locbaml/generate LocalizationIssue.resources.dll/trans:loc.csv/out: c: \/cul: ru-US
Теперь, когда я переключу культуру пользовательского интерфейса на французский, он по-прежнему показывает английский перевод TextBlock со связыванием, но локализованное значение для другого текстового блока.
Любые идеи, что я делаю неправильно? Каков ваш опыт работы с "locbaml" -approach? Должны ли мы пойти традиционным способом с resx файлами?
Спасибо за любой вклад;)
Попробовать копирование в новый файл может быть loc_us.csv и внести изменения, затем запустите locbaml/generate LocalizationIssue.resources.dll/trans:loc_us.csv/out: c: \/cul: ru-US