Как обновить интерфейс окна после настройки CurrentUICulture? - PullRequest
9 голосов
/ 12 июля 2011

Я пытался установить CurrentUICulture приложения во время выполнения. Однако пункты меню в моих формах остались без изменений. Нужно ли мне что-то делать для изменения CurrentUICulture?

Ответы [ 5 ]

9 голосов
/ 14 мая 2015

Опоздал на вечеринку снова. Но вот решение, которое я придумал:

public partial class MainForm : Form {

    public MainForm() {
        InitializeComponent();
    }

    private void mnuCultureEnglish_Click( object sender, EventArgs e ) {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "en-US" );
        Controls.Clear();
        InitializeComponent();
    }

    private void mnuCultureGerman_Click( object sender, EventArgs e ) {
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( "de-DE" );
        Controls.Clear();
        InitializeComponent();
    }
}
7 голосов
/ 12 июля 2011

Извлечено из результатов поиска Google: http://bytes.com/topic/net/answers/468556-change-currentuiculture-controls-doesnt-refresh

Изменение "CurrentUICulture" не вступит в силу автоматически во всех элементах управления пользовательского интерфейса.

Изменение "CurrentUICulture" влияет только на некоторые APIкоторые предназначены для локализации.Например, «System.Resources.ResourceManager.GetString (...)», Затем он будет использовать текущий «CurrentUICulture» для загрузки подходящих строковых ресурсов.

Для элемента управления Windows.Form необходимо перезагрузитьвсе строки ресурсов после изменения «CurrentUICulture».

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

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

Кроме того, убедитесь, что вы установили CurrentUICulture в потоке пользовательского интерфейса.

Вот несколько примеровкод для обновления вашего пользовательского интерфейса (опять же, украденный по ссылке в верхней части этого ответа):

System.Threading.Thread.CurrentThread.CurrentUICulture = new 
System.Globalization.CultureInfo(lang); //my selected lang from menu

ReloadControlString();

//...

private void ReloadControlString()
{
    System.Resources.ResourceManager resources = new 
    System.Resources.ResourceManager(typeof(FormMain));

    this.menuApp.Text = resources.GetString("menuApp.Text");
}

Вы, вероятно, можете получить часть этого из InitializeComponent().

1 голос
/ 23 декабря 2013

По крайней мере, вы можете попробовать этот цикл после изменения CurrentUICulture:

foreach (Control ctl in this.Controls)
        {
            resources.ApplyResources(ctl, ctl.Name);
        }
1 голос
/ 04 августа 2012

Предполагается, что вы использовали VS или совместимую утилиту для создания файлов .resx:

var crm = new ComponentResourceManager(typeof(My_Form));
crm.ApplyResources(this.my_button, "my_button");
//    etc ... 

Это может сэкономить вам немного ручного труда при настройке всех локализуемых свойств вручную, а также необходимости использовать GetXXX (строка) перегрузки.

0 голосов
/ 12 июля 2011

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

CultureInfo _cinfo = new CultureInfo("fr-FR");

Thread.CurrentThread.CurrentCulture = _cinfo;
Thread.CurrentThread.CurrentUICulture = _cinfo;

//After changing the Culture just access the value of relevant culture through resource file
label1.text = CommonResource.Ready;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...