Из-за спецификаций дизайна архитектуры у меня есть приложение, которое заполняет его виды от ClassLibraries
. Само приложение ведет себя как своего рода интегратор.Добавить ресурсы локализации для совместного использования несколькими проектами
Теперь мне нужно добавить ресурсы локализации, и я могу успешно достичь этого, добавив *.resw
файлы, но , только если элемент управления объявлен внутри проекта приложения.
На самом деле мне нужно, чтобы мы могли делиться этими ресурсами через ПОЛНОЕ РЕШЕНИЕ как-то.
Тогда необходимо, чтобы можно было преобразовать содержимое любого элемента управления в решение с использованием ресурсов локализации, предпочтительно используя описанную выше структуру.
Например, у меня есть следующий вид, который заполняет "содержание TextBlocks
в зависимости от выбранного языка:
<ComboBox x:Name="Languages"
ItemsSource="{Binding Languages}"
SelectedItem="{Binding SelectedLanguage, Mode=TwoWay}">
<i:Interaction.Behaviors>
<iCore:EventTriggerBehavior EventName="SelectionChanged">
<iCore:InvokeCommandAction Command="{Binding ChangeLanguage}" />
</iCore:EventTriggerBehavior>
</i:Interaction.Behaviors>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding LanguageName}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<TextBlock Text="{Binding Model.HelloText}" FontSize="50" Foreground="Red"/>
<TextBlock Text="{Binding Model.HowAreYouText}" FontSize="50" Foreground="Red"/>
<BFview:BFView />
</StackPanel>
Где BFView
это вид, сохраненный в другом проекте (имеет два фиктивных TextBlocks также)
Model
этой точки зрения:
public class MainModel : TranslatableStrings
{
private string helloText, howareuText;
public string HelloText
{
get { return this.helloText; }
set { SetProperty(ref this.helloText, value); }
}
public string HowAreYouText
{
get { return this.howareuText; }
set { SetProperty(ref this.howareuText, value); }
}
}
И базового класса Model
только договорное класс, поскольку он не имеет реализации, но базовый тип:
public abstract class TranslatableStrings : BindableBase { }
Затем контекст данных View
заключается в следующем:
public class MainViewModel : BaseViewModel
{
private ObservableCollection<MainViewListRscs> languages = new ObservableCollection<MainViewListRscs>();
private ICommand changeLang;
private MainModel model = new MainModel();
public MainViewModel()
{
Languages = new ObservableCollection<MainViewListRscs>()
{
new MainViewListRscs { LanguageCode = "es-ES", LanguageName = "Español" },
new MainViewListRscs { LanguageCode = "en-EN", LanguageName = "English" },
new MainViewListRscs { LanguageCode = "fr-FR", LanguageName = "Français" },
new MainViewListRscs { LanguageCode = "de-DE", LanguageName = "Deutsch" }
};
}
public ICommand ChangeLanguage
{
get { return changeLang = changeLang ?? new DelegateCommand(OnChangeLanguageRequested); }
}
public ObservableCollection<MainViewListRscs> Languages
{
get { return this.languages; }
set
{
this.languages = value;
OnPropertyChanged();
}
}
public MainViewListRscs SelectedLanguage { get; set; }
public MainModel Model
{
get { return this.model; }
set { this.model = value; }
}
private void OnChangeLanguageRequested()
{
Logger.Debug("MAINVIEW", SelectedLanguage.LanguageName + " selected.");
TranslateManager.UpdateStrings<TranslatableStrings>(SelectedLanguage.LanguageCode, this.Model);
}
public override Task OnNavigatedFrom(NavigationEventArgs args)
{
return null;
}
public override Task OnNavigatedTo(NavigationEventArgs args)
{
return null;
}
}
И TranslateManager
:
public class TranslateManager
{
public async static void UpdateStrings<T>(string langCode, T instance) where T : TranslatableStrings
{
//Get all the classes that implement TranslatableStrings
var currentAssembly = instance.GetType().GetTypeInfo().Assembly;
var translatableClasses = currentAssembly.DefinedTypes.Where(type => type.BaseType == typeof(T)).ToList();
//Open RESX file
ResourceLoader resx = ResourceLoader.GetForCurrentView(langCode);
foreach(var Class in translatableClasses)
{
foreach(var property in Class.DeclaredProperties)
{
string value = resx.GetString(property.Name);
var vmProp = instance.GetType().GetTypeInfo().GetDeclaredProperty(property.Name);
vmProp.SetValue(instance, value);
}
}
}
}
Я достиг изменения двух TextBlocks
MainView
, но не для представления в другом проекте. Мне нужно будет сделать список сборок, содержащихся в решении. Я предполагаю, что получить именно это сделает все, потому что я использую общую реализацию.
Любое предложение будет высоко оценено.
Спасибо!
Спасибо, что ответили! Я работаю над решением, реализующим перевод, так, как вы мне предложили, но теперь я думаю, что у меня есть ментальный блок ... См. Обновленный вопрос –