Любая помощь для оптимизации или идеи (в комментариях) о том, почему это не работает, будет оценена!
ал, как изменить язык формы, которая имеет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
, Я не знаю.
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я проверил, чтобы получить Resource Manager моей формы от Culture Info, и он каждый раз возвращает значение по умолчанию:
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) без везения. Как будто он никогда не существует или заменен, но в моем дизайне и файловом обозревателе я могу видеть файлы.
EDIT2:
Возможно, это потому, что я использую ILMerge для объединения всех библиотек в один. Я рассматриваю это:Развертывание многоязычных Windows Forms для одной сборки (ILMerge и сателлитные сборки / локализация) - возможно?
Ответить на EDIT2:
Да, удаление ILMerge проблема решена, и первое решение, которое я дал, решает это. Но по какой-то причине испанский язык считается языком по умолчанию, и когда я попытался извлечь из него набор ресурсов, он мне ничего не дал.
Кроме того, я установил для атрибута Localizable значение false, и он не создал файл resx по умолчанию со значениями. Я не знаю, хорошая ли это практика.
Я попробую что-то новое ...