Использование resx-строки из pcl в axml?

У меня есть resx-файлы для локализации в Portable-class-библиотеке в классе MyAppResources. Итак, в коде я могу получить локализованные строки только с помощью:

 View.FindViewById<Button>(Resource.Id.btnCacheClear).Text = MyAppResources.TextClearCache;

Но есть ли способ установить эту строку уже в axml?

 <Button
     android:id="@+id/btnCacheClear"
     android:text= ??   />

Спасибо, Том


person Tom    schedule 03.04.2014    source источник


Ответы (2)


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

Я работаю с MvvmCross, и он работает с парсером привязки пользовательского языка:

public class CustomLanguageBindingParser : MvxBindingParser , IMvxLanguageBindingParser
{
    protected override MvxSerializableBindingDescription ParseBindingDescription()
    {
        this.SkipWhitespace();

        string resourceName = (string)this.ReadValue();

        // Pass the resource name in as the parameter on the StringResourceConverter.
        return new MvxSerializableBindingDescription
        {
            Converter = "StringResource",
            ConverterParameter = resourceName,
            Path = null,
            Mode = MvxBindingMode.OneTime
        };
    }

    public string DefaultConverterName { get; set; }

    public string DefaultTextSourceName { get; set; }
}

И преобразователь:

public class StringResourceConverter : IMvxValueConverter
{
    private static ResourceManager manager = new ResourceManager(typeof(AppResources));

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Ignore value. We are using parameter only.
        return manager.GetString((string)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Зарегистрируйте свой парсер в своем классе MvxAndroidSetup:

    protected override void InitializeIoC()
    {
        base.InitializeIoC();

        Mvx.RegisterType<IMvxLanguageBindingParser, CustomLanguageBindingParser>();
    }

В вашем .axml определите пространство имен xmlns:local="http://schemas.android.com/apk/res-auto"

И вызвать ресурс. Например, в TextView: local:MvxLang="Text MyResourceKey"

Это подключается к системе привязки MvvmCross. Первая часть «Текст» определяет целевое свойство, а вторая часть анализируется как ключ ресурса. Синтаксический анализатор языковой привязки переводит это в привязку с вашим пользовательским преобразователем и ключом в качестве параметра преобразователя. Преобразователь выполняет поиск строки на основе параметра преобразователя.

person RandomEngy    schedule 09.11.2015

Использование строки/любых ресурсов из RESX-файла в Android Designer не поддерживается, установка их из кода возможна только на данный момент.

person Prashant Cholachagudda    schedule 07.04.2014
comment
Я узнал, что он работает в Designer только с android:text=@string/TextClearCache. Строка берется из PCL и даже корректно меняется в зависимости от языка в Designer. Но он не компилируется: Ошибка Не найден ресурс, соответствующий заданному имени (в «тексте» со значением «@string/TextClearCache») - person Tom; 07.04.2014