Winforms: Включение локализации по умолчанию (применение политики проекта / решения) - PullRequest
1 голос
/ 19 марта 2010

Есть ли простой способ установить для свойства Localizable значение true для вновь созданных пользовательских элементов управления / форм? Область действия настройки в идеале должна быть решением или проектом.

Другими словами, я хочу сказать, что этот проект / решение должно быть локализуемым, а затем, если я добавлю новую форму или элемент управления VS, автоматически установит для свойства значение true.

Редактировать:

Хотя пользовательские шаблоны возможны, в большой команде они могут использоваться не всегда. Так что это больше о применении политики, гарантирующей, что члены команды не должны устанавливать свойство для проектов / решений, где требуется, чтобы все формы / элементы управления, содержащие текстовые ресурсы, были локализуемыми.

Примечание: Team Foundation Server не является опцией.

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Можно написать модульный тест, который использует отражение, чтобы определить, была ли форма / пользовательский элемент управления помечены как локализуемые. В частности, если тип был помечен как локализуемый, будет встроенный файл ресурсов, связанный с типом, и этот файл будет содержать значение «>> $ this.Name». Вот пример кода:

    private void CheckLocalizability()
    {
        try
        {
            Assembly activeAssembly = Assembly.GetAssembly(this.GetType());
            Type[] types = activeAssembly.GetTypes();
            foreach (Type type in types)
            {
                if (TypeIsInheritedFrom(type, "UserControl") || TypeIsInheritedFrom(type, "Form"))
                {
                    bool localizable = false;
                    System.IO.Stream resourceStream = activeAssembly.GetManifestResourceStream(string.Format("{0}.resources", type.FullName));
                    if (resourceStream != null)
                    {
                        System.Resources.ResourceReader resourceReader = new System.Resources.ResourceReader(resourceStream);
                        foreach (DictionaryEntry dictionaryEntry in resourceReader)
                        {
                            if (dictionaryEntry.Key.ToString().Equals(">>$this.Name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                localizable = true;
                                break;
                            }
                        }
                    }
                    if (!localizable)
                    {
                        Debug.Assert(false, string.Format("{0} is not marked localizable.", type.FullName));
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Debug.Assert(false, string.Format("Exception occurred: Unable to check localization settings.  {0}", ex.Message));
        }
    }

    private bool TypeIsInheritedFrom(Type type, string baseType)
    {
        while (type != null)
        {
            if (type.Name.Equals(baseType, StringComparison.InvariantCultureIgnoreCase))
                return true;
            type = type.BaseType;
        }

        return false;
    }

Пожалуйста, дайте мне знать, если это поможет.

2 голосов
/ 19 марта 2010

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

Например: Project + Add User Control.Установите для свойства Localizable значение True.Файл + Экспорт шаблона, выберите Шаблон элемента.Следующий.Проверьте элемент управления, который вы добавили.Следующий.Проверьте все ссылки, пропустите только те, которые вам никогда не понадобятся.Следующий.Присвойте ему правильное имя шаблона (скажем, «Локализуемый пользовательский элемент управления»).

Теперь у вас будет шаблон элемента, доступный для будущих проектов, для которого установлено свойство.Повторите при необходимости для других шаблонов элементов, таких как Форма.

...