Я искал, как изменить язык формы, у которой для атрибута Localizable
установлено значение true.
https://msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture(v=vs.110).aspx
Это необходимо для установки языка формы, но это необходимо установить до того, как мы создадим экземпляр формы. Это не может быть вызвано после этого события.
В поисках информации я увидел следующий вопрос: https://stackoverflow.com/a/11738932/3286975, но, как сказано в комментарии, у меня есть элементы управления внутри TabControl и MenuStrip, поэтому они не затронуты.
Я попытался изменить это, безуспешно получив все элементы управления формы.
В этом меню я вызываю следующий обратный вызов:
private void englishToolStripMenuItem_Click_1(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
private void spanishToolStripMenuItem_Click(object sender, EventArgs e)
{
string lang = (string) ((ToolStripMenuItem) sender).Tag;
base.Culture = CultureInfo.CreateSpecificCulture(lang);
}
Я меняю культуру с помощью тега.
Когда я нажимаю на нее, ничего не происходит. Кроме того, я немного изменил метод ApplyResources из упомянутого ответа.
private void ApplyResources(Control parent, CultureInfo culture)
{
this.resManager.ApplyResources(parent, parent.Name, culture);
foreach (Control ctl in parent.IterateAllChildren())
{
//this.ApplyResources(ctl, culture);
this.resManager.ApplyResources(ctl, ctl.Name, culture);
}
}
Где IterateAllChildren - это следующее: https://stackoverflow.com/a/16725020/3286975
Кроме того, я безуспешно пробовал с (System.LINQ): Controls.OfType<Label>()
(потому что у меня есть один ярлык для проверки) ...
Но когда я выбираю испанский язык, текст не меняется.
Так что, может быть, я не справляюсь с детьми. А может, вызвав метод CreateCulture
, не знаю.
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я протестировал, чтобы получить диспетчер ресурсов моей формы с помощью информации о культуре, и он каждый раз возвращает значение по умолчанию:
ResourceSet resourceSet = new ResourceManager(typeof(frmCredentials)).GetResourceSet(new CultureInfo(lang), true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value; //resourceSet.GetString(resourceKey);
if (resource.GetType().Equals(typeof(string)))
Console.WriteLine("Key: {0}\nValue: {1}\n\n", resourceKey, (string) resource);
}
Где new CultureInfo(lang)
, я тоже тестировал: new CultureInfo("es")
& Thread.CurrentThread.CurrentCulture
(CurrentUICulture) безуспешно. Как будто он никогда не существует или не заменяется, но в моем дизайне и проводнике файлов я могу видеть файлы.
РЕДАКТИРОВАТЬ2:
Может быть, потому, что я использую ILMerge для объединения всех dll в одну уникальную. Я просматриваю это: с одной сборкой, несколько -языковое развертывание Windows Forms (ILMerge и вспомогательные сборки / локализация) - возможно?
Ответ на EDIT2:
Да, при удалении ILMerge проблема решена, и первое решение, которое я дал, решает эту проблему. Но по какой-то причине испанский язык выбран в качестве языка по умолчанию, и когда я попытался получить от него набор ресурсов, он мне ничего не вернул.
Кроме того, я установил для атрибута Localizable значение false, и он не создал файл resx по умолчанию со значениями. Не знаю, хорошая ли это практика.
Я попробую что-нибудь новенькое ...
TabControl
иMenuStrip
, вы можете изменить свой методIterateAllChildren
, чтобы специально отслеживать эти элементы управления и выполнять особую обработку, чтобы гарантировать, что вы охватите все их дочерние элементы управления. Повторная инициализация формы (как предложила @Isma) была бы лучшим подходом, если бы вы могли справиться с очисткой всех данных в форме (например, сначала сохранив их). - person wablab   schedule 01.09.2017