2016-10-20 2 views
0

Из-за спецификаций дизайна архитектуры у меня есть приложение, которое заполняет его виды от 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); 
       } 
      } 

     } 

    } 

Я достиг изменения двух TextBlocksMainView, но не для представления в другом проекте. Мне нужно будет сделать список сборок, содержащихся в решении. Я предполагаю, что получить именно это сделает все, потому что я использую общую реализацию.

Любое предложение будет высоко оценено.

Спасибо!

ответ

0

Файлы для перевода загружаются как ресурсы. Таким образом, вы можете получить доступ к ним в любом месте, даже в других проектах, делая что-то вроде

private ResourceLoader _resourceLoader = new ResourceLoader(); 
var someTranslation =_resourceLoader.GetString("your_localization_key"); 

Wrap этот код красиво в Lib, так что вы можете иметь легкий доступ к нему отовсюду, и там вы идете!

+0

Спасибо, что ответили! Я работаю над решением, реализующим перевод, так, как вы мне предложили, но теперь я думаю, что у меня есть ментальный блок ... См. Обновленный вопрос –

Смежные вопросы