Приложение хранилища ресурсов Windows ResourceLoader во время разработки

Я начал создавать приложение для Windows Store для Windows 8.1, и теперь у меня возникла проблема с локализацией.

Я хотел бы отобразить строковый ресурс из файла .resw во время разработки, но каждая попытка сделать это потерпела неудачу, хотя она работает во время выполнения.

При использовании атрибута x: Uid мне все равно нужно предоставить свойство Text (т.е. для TextBlock), и мне не нравится дважды писать текст.

Я также попытался создать свойство для строки в viewmodel:

public string Title
{
    get { return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title"); }
}

Это работает во время выполнения, но во время разработки оно пустое.

Итак, вопрос в том, есть ли способ отображать ресурсы из .resw файла в XAML-дизайнере?

В частности, класс класса ResourceManager позволяет читать файлы .resw во время разработки?

Спасибо за вашу помощь, Лукас

Ответ 1

Старый метод

Итак, есть несколько вещей, которые вы можете сделать.

Первый (и самый простой, если вы используете x:Uid уже), - это просто отправить текст в поле "Текст". x:Uid -связанное значение будет перезаписывать все, что там есть.

<TextBlock Text="MyText" x:Uid="MainView_Title"/>

Второй способ - использовать свойство, как у вас уже есть, а затем проверить, находится ли приложение во время разработки (через несколько разных методов), а затем вернуть постоянное значение, если оно есть, и ресурс, если он нет.

public string Title
{
     if(ViewModelBase.IsInDesignTimeStatic) //Mvvm Light easy accessor
         return "My Text";
     return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title");
}

Надеюсь, это поможет и счастливое кодирование!

Изменить: похоже, есть новый способ сделать это, по крайней мере, с Windows 8.1.

Новый метод

  • Создайте класс, который ссылается на ResourceLoader (аналогично описанному выше свойству).
  • Создайте индексированный аксессуар свойств, который принимает строковый ключ и возвращает значение из ResourceLoader.

    public class LocalizedStrings
    {
        public string this[string key]
        {
            get
            {
                return App.ResourceLoader.GetForViewIndependentUse().GetString(key);
            }
        }
    }
    
  • В App.xaml укажите StaticResource этого типа.

    <Application.Resources>
        <ResourceDictionary>
            <common:LocalizedStrings x:Key="Localized"/>
        </ResourceDictionary>
    </Application.Resources>
    

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

<TextBlock Text="{Binding Source={StaticResource Localized}, Path=[MainView_Title]}" />

Вы можете перемешать его вокруг, чтобы быть более читабельным, если хотите, например:

<TextBlock Text="{Binding [MainView_Title], Source={StaticResource Localized}}" />

Ответ 2

Это старый поток, но поскольку Nate предоставил такое элегантное решение проблемы для Win8.1, я решил, что спрошу здесь...

После долгих исследований и экспериментов решение Nate, похоже, не работает для приложений UWP для Win10 в VS2017 Community. Подход LocalizedString отлично работает во время выполнения, но появляется

App.ResourceLoader.GetForViewIndependentUse().GetString(key);

отказывается возвращать что-либо, кроме String.Empty, во время разработки. Я много экспериментировал и что-то вроде

ResourceContext.GetForViewIndependentUse().QualifierValues

Похоже, что он идентичен между временем выполнения (рабочим) и временем разработки (не работает).

Мне было интересно, если кто-нибудь столкнулся с этим и решил это. Нейт?:)