Немного подробнее: можно создать несколько .resx-файлов, для каждой из культур, и там будут содержаться соответствующие свойства контролов для каждого из языков: Text, Size, Position и т.д. При переключении языка приложения(т.е. когда пользователь инициализирует событие переключения) необходимо выполнить:
Thread.CurrentThread.CurrentUICulture = new CultureInfo(«ru-RU»);
следующий шаг — из менеджера ресурсов получать соответствующие свойства:
но чтобы не указывать каждому из контролов какое свойство ему получить, можно просто вызывать метод, который с помощью рефлексии будет смотреть, что есть на форме и в resx-файле, и сопоставлять. Итак, код метода:
//метод для установки локализации формы «на лету»
public void localizeForm(Form someForm, CultureInfo cultureInfo)
{
Type someFormType = someForm.GetType();
ResourceManager res = new ResourceManager(someFormType);
//зададим список свойств объектов, которые будем извлекать из файла ресурсов
string[] properties = { «Text», «Location» };
foreach (string propertyName in properties)
{
//выбор всех свойств класса формы, извлечение из файла ресурсов значения, и их установка
foreach (FieldInfo fieldInfo in someFormType.GetFields(BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Instance))
{
PropertyInfo propertyInfo = fieldInfo.FieldType.GetProperty(propertyName);
if (propertyInfo == null)
continue;
object objProperty = res.GetObject(fieldInfo.Name + '.' + propertyInfo.Name, cultureInfo);
if (objProperty == null) continue;
object field = fieldInfo.GetValue(someForm);
if (field != null)
propertyInfo.SetValue(field, objProperty, null);
}
//код для установки свойств самих форм
PropertyInfo propertyInfo1 = someFormType.GetProperty(propertyName);
if (propertyInfo1 == null)
continue;
object objProperty1 = res.GetObject("$this." + propertyInfo1.Name, cultureInfo);
if (objProperty1 == null) continue;
propertyInfo1.SetValue(someForm, objProperty1, null);
}
}
В результате, с помощью небольших затрат можно менять «на лету» язык приложения.
Для WinForms в любом случае возможно «на лету» переключать язык, т.е. менять картинки, надписи, их размер и расположение. В своем блоге я приводил пример с исходными кодами как это сделать и автоматизировать при помощи рефлексии.
Отличная статья, спасибо! Аналогично Вашей ситуации, некоторое время пытался практиковать тайм-менеджмент, а именно по методологии Архангельського. И также убедился, что универсальных систем управления временем вообще не существует, нужно выработать свою стратегию. Правда, еще не подошел к какой-то определенной системе, удобной для меня, и пока еще не написал свою программку для этого )))
Предлагаю провести такой же опрос, но на русском и для русскоязычной аудитории. Результаты скорее всего будут противоположными, хотя очень интересно было бы сраавнить
Да, не думал что после ВУЗа меня коснется такие, на первый взгляд, сугубо теоретические вещи, как коды Рида-Соломона. Но буквально сразу же, при написании своих фреймворков для формирования штрих-кодов, вплотную с ними столкнулся для восстановления ошибок печати/хранения и т.п. Потрясающий эффект! Например удавалось считывать значения штрихкода PDF417 после отрыва более половины площади штрихкода!
Thread.CurrentThread.CurrentUICulture = new CultureInfo(«ru-RU»);
следующий шаг — из менеджера ресурсов получать соответствующие свойства:
ResourceManager LocRM = new ResourceManager(«WindowsApplication1.WinFormStrings»,typeof(Form1).Assembly);
Label1.Text = LocRM.GetString(«Label1.Text»), Thread.CurrentThread.CurrentUICulture);
Label2.Text = LocRM.GetString(«Label2.Text»), Thread.CurrentThread.CurrentUICulture);
но чтобы не указывать каждому из контролов какое свойство ему получить, можно просто вызывать метод, который с помощью рефлексии будет смотреть, что есть на форме и в resx-файле, и сопоставлять. Итак, код метода:
//метод для установки локализации формы «на лету»
public void localizeForm(Form someForm, CultureInfo cultureInfo)
{
Type someFormType = someForm.GetType();
ResourceManager res = new ResourceManager(someFormType);
//зададим список свойств объектов, которые будем извлекать из файла ресурсов
string[] properties = { «Text», «Location» };
foreach (string propertyName in properties)
{
//выбор всех свойств класса формы, извлечение из файла ресурсов значения, и их установка
foreach (FieldInfo fieldInfo in someFormType.GetFields(BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Instance))
{
PropertyInfo propertyInfo = fieldInfo.FieldType.GetProperty(propertyName);
if (propertyInfo == null)
continue;
object objProperty = res.GetObject(fieldInfo.Name + '.' + propertyInfo.Name, cultureInfo);
if (objProperty == null) continue;
object field = fieldInfo.GetValue(someForm);
if (field != null)
propertyInfo.SetValue(field, objProperty, null);
}
//код для установки свойств самих форм
PropertyInfo propertyInfo1 = someFormType.GetProperty(propertyName);
if (propertyInfo1 == null)
continue;
object objProperty1 = res.GetObject("$this." + propertyInfo1.Name, cultureInfo);
if (objProperty1 == null) continue;
propertyInfo1.SetValue(someForm, objProperty1, null);
}
}
В результате, с помощью небольших затрат можно менять «на лету» язык приложения.
Спасибо, статья заставила задуматься