Локализация компонентов WinForms для OptionDialog

Автор Тема: Локализация компонентов WinForms для OptionDialog  (Прочитано 8252 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Код - C# [Выбрать]
  1. CultureInfo win = Thread.CurrentThread.CurrentCulture;
Посмотри что тебе Александр Наумович в первом ответе написал. Если нужна локализация системы, то не то читаешь. Возможно именно в этом проблема.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Да, я видел. Но на той системе, которую сегодня исправлял, там Английский Автокад возвращал именно язык Windows - русский. Т.е. в чем-то другом была проблема. И на этой системе я добился нормальной работы. Сейчас жду ответа от ребят у которых тоже были проблемы - посмотрим.
А откуда можно надежно получить язык именно Windows? CultureInfo.InstalledUICulture ?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, я видел. Но на той системе, которую сегодня исправлял, там Английский Автокад возвращал именно язык Windows - русский
Так если английский AutoCAD установлен на русский Windows, то это нормально же?
А откуда можно надежно получить язык именно Windows?
Если тебя интересует CultureInfo для Windows, то CultureInfo.InstalledUICulture
В общем, я так понял, что если тебе надо гарантированно получить язык системы в форме, то можно сделать так:
Код - C# [Выбрать]
  1. CultureInfo oldCulture = CultureInfo.CurrentUICulture;            
  2. bool needSwitch = CultureInfo.InstalledUICulture.LCID != oldCulture.LCID;
  3. if (needSwitch)
  4. {
  5.     // тут объект ссылочного типа, поэтому, на всякий случай создаём новый
  6.     CultureInfo.CurrentUICulture = new CultureInfo(CultureInfo.InstalledUICulture.LCID);
  7. }
  8. try
  9. {
  10.     TestForm form = new TestForm();
  11.     Application.ShowModalDialog(form);
  12. }
  13. finally
  14. {
  15.     CultureInfo.CurrentUICulture = oldCulture;
  16. }
  17.  

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кажется, я понял, в чём у тебя загвоздка - непонимание, какая CultureInfo за что отвечает:
CurrentCulture - это языковые настройки текущего потока. Используются, например, для преобразования числовых форматов, денежных единиц и т.п.
CurrentUICulture - это языковые настройки, которые используются для локализации диалогов текущего потока.
Эти два параметра AutoCAD меняет внутри себя как хочет. Иногда даже в разных версиях они имеют разные значения, я на этом уже обжигался: http://adn-cis.org/forum/index.php?topic=9132.0
Какой язык установлен в операционной системе, скорее всего, влияет на эти значения только косвенно. То, что это непостоянное значение, легко подтверждается тем, что мы сами можем их менять.
А вот именно язык операционной системы - это InstalledUICulture. Его можно только прочитать. Изменяется только в настройках Windows и требует завершения сеанса для применения изменений.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Ок. Попробую так. Думаю не важно сравнивать CultureInfo или их LCID. А CultureInfo.CurrentUICulture в Net 4.5 только для чтения. Так что пишу Thread.CurrentThread.CurrentUICulture. Вроде бы не должно быть разницы.
Спасибо!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Думаю не важно сравнивать CultureInfo или их LCID.
Я не знаю, как там внутри сравнение идёт. В теории - да, наверное, неважно. А так, мы можем взять, например, две одинаковые культуры (например, "ru-RU") и у одной из них поменять какие-то внутренние настройки (например, десятичный числовой разделитель). Если потом их сравнить - вернут ли они одинаковый результат? Я не знаю - может да, а может и нет... А вот их LCID (а также Name и другие идентификаторы) останутся одинаковыми. Но всё это мелочи, на самом деле. Так как, в данном случае, можно вообще не делать проверку, а просто подставлять CultureInfo системы.
А CultureInfo.CurrentUICulture в Net 4.5 только для чтения. Так что пишу Thread.CurrentThread.CurrentUICulture. Вроде бы не должно быть разницы.
Думаю да - это одно и то же должно быть.

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
например, десятичный числовой разделитель
Хм, в самом деле... Я ж так все время делаю - меняю запятую на точку... Опять спасибо за комментарий - буду сравнивать по LCID.