Использование встроенных ресурсов в Silverlight (4) - другие культуры не компилируются - PullRequest
3 голосов
/ 09 июня 2010

У меня возникают трудности с предоставлением локализованных строк для пользовательского интерфейса в небольшом приложении Silverlight 4. В основном я поместил папку «Ресурсы» и поместил в нее два файла ресурсов:

Statuses.resx
Statuses.ro.resx

У меня есть enum Статусы:

public enum Statuses
{
    None,
    Working
}

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

public class StatusToMessage : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!Enum.IsDefined(typeof(Status), value))
        {
            throw new ArgumentOutOfRangeException("value");
        }
        var x = Statuses.None;
        return Statuses.ResourceManager.GetString(((Status)value).ToString(), Thread.CurrentThread.CurrentUICulture);
    }

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

в представлении у меня есть текстовый блок:

    <TextBlock Grid.Column="3" Text="{Binding Status, Converter={StaticResource StatusToMessage}}" />

При рендеринге представления вызывается конвертер, но независимо от того, какой Thread.CurrentThread.CurrentUICulture установлен, он всегда возвращает значение культуры по умолчанию.

После дальнейшей проверки я разобрал полученный файл XAP, передал полученный файл DLL в Reflector и проверил встроенные ресурсы. Он содержит только ресурс по умолчанию !!

Возвращаясь к двум файлам ресурсов, я сейчас проверяю их свойства:

Действие построения: встроенный ресурс Копировать в выходной каталог: не копировать Пользовательский инструмент: ResXFileCodeGenerator Пространство имен пользовательского инструмента: [пусто]

Оба файла ресурсов (.resx) имеют эти настройки. В результате .Designer.cs приводятся следующие файлы:

Statuses.Designer.cs:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace SilverlightApplication5.Resources {
    using System;


    /// <summary>
    ///   A strongly-typed resource class, for looking up localized strings, etc.
    /// </summary>
    // This class was auto-generated by the StronglyTypedResourceBuilder
    // class via a tool like ResGen or Visual Studio.
    // To add or remove a member, edit your .ResX file then rerun ResGen
    // with the /str option, or rebuild your VS project.
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    internal class Statuses {

// ... yadda-yadda

Statuses.ro.Designer.cs

[пусто]

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

Что не так?

1 Ответ

6 голосов
/ 10 июня 2010

Оказывается, тебе просто нужно сделать еще одну легкую вещь. Как говорится в статье MSDN :

В обозревателе решений щелкните правой кнопкой мыши имя проекта, а затем нажмите кнопку «Выгрузить» Проект, чтобы закрыть проект пока оставив значок проекта видимым.

В обозревателе решений щелкните правой кнопкой мыши имя проекта, а затем нажмите кнопку «Изменить».

Файл проекта открывается в Visual Studio XML Editor.

В файле проекта добавьте имена регионально нейтральный и специфический культуры, спутниковые сборки которых Ваше приложение создано для Тег <<strong> SupportedCultures >. Если твой приложение поддерживает несколько культур, используйте точку с запятой (;) для разделите их имена. Этот список культуры не должны включать ваши культура приложения по умолчанию. За Например, тег <<strong> SupportedCultures > для приложение, чья культура по умолчанию является английским ("en"), и это поддерживает английский - США («en-US»), Французский ("fr"), французский - Франция ("fr-FR"), русский ("ru") и русский - Культура России ("ru-RU") может выглядеть следующим образом:

<SupportedCultures>en-US;fr;fr-FR;ru;ru-RU;</SupportedCultures>

Итак, не забудьте f! @ # Вручную отредактировать файл проекта и указать, какие культуры включить в компиляцию.

Теперь все работает: D

...