Я создаю Приложение C# на основе WinForms / KryptonForms, и поскольку приложение является промежуточным в разработке, я думал мне, я лучше всего улаживаю локализацию.
Поскольку перенесенный и воспитанный PHP программист (и я знаю C#, является совершенно новым уровнем), я создал бы класс для обнаружения языка, и автоматический присваивают пакет языка приложению. и затем используйте объекты языка получить доступ к значениям.
Я задаюсь вопросом, могу ли я получить некоторые примеры на самом легком / Лучшие методы выполнения этого.
Я лично хотел бы что-то вроде Параметров настройки приложения
Где обычно я делал бы MyApplication.Properties.Settings.Default.SomeKey
Я надеялся a MyApplication.Languages.Current.ApplicationTitle
и MyApplication.Languages.en.ApplicationTitle
например.
Также, только загружая единственный ресурс на файл языка для улучшения скорости было бы выгодно также.
Так загрузки языка в английском, испанском пользователе продвинут, что это приложение находится на английском языке, был бы он любить изменять его на испанский язык, он нажимает кнопку Да, настройки обновлены, и приложение перезапускает и загружает единственный испанский пакет языка.
Каковы Ваши мысли об этом?
Править:
Приложение основано на Протоколах XMPP и пользуется agsXMPP Библиотеками. От моего понимания каждого пользователя, который отправляет меня, их присутствие должно также отправить язык, их система идет.
Так в основном, если существует какой-либо способ "схватить" факт хранения отдельного слова и использования __("some string")
в моем приложении было бы возможно, но тем временем я просто смотрю на текст GUI.
Мы выполняем локализацию следующим образом:
После компиляции вашего приложения создается AppName.resources.dll. Эта dll содержит все ресурсы вашего приложения и затем может использоваться с такими инструментами, как Visual Localize, для перевода строк на другой язык, например английский, испанский и т. Д.
Вы должны использовать ресурсы.
Вы можете изменять язык динамически:
1) в консольном приложении:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
double a = 100.12;
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a);
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
Console.WriteLine("{0} - {1}", Thread.CurrentThread.CurrentCulture, a);
Console.ReadLine();
2) в приложении winforms мы можем переоткрыть форму для применения ресурсов локализации (используйте свойства Localizable и Language в дизайнере форм для автоматической генерации ресурсов для каждого языка):
if (Thread.CurrentThread.CurrentCulture.Name == "en-US")
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU");
}
else
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
double a = 100.12;
textBox1.Text = a.ToString(Thread.CurrentThread.CurrentCulture);
Form1 f = new Form1();
f.ShowDialog();
3) используя множество потоков с собственной локализацией
private void button1_Click(object sender, EventArgs e)
{
// for example main thread language is en-US
Thread t = new Thread(StartForm);
t.CurrentUICulture = new CultureInfo("ru-RU");
t.Start();
//t.Join();
}
public static void StartForm()
{
Form1 f = new Form1();
f.ShowDialog();
}
Мы используем Resources.MyResources.SomeString, который автоматически переводится на нужный язык. Файлы ресурсов называются MyResources.de-DE.resx, MyResources.nl-BE.resx и т. Д. В основном тот же метод, что и в свойствах проекта.
Пример кода перевода:
public void TranslateForm()
{
menuItem11.Text = Resources.MyResources.Nieuw;
menuItem12.Text = Resources.MyResources.Verwijderen;
menuItem13.Text = Resources.MyResources.Kopieren;
}
Или вы можете сделать это вручную, например:
menuItem11.Text = Translator.GetString("New", "de-DE" );
...
public static string GetString( string varname )
{
string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources";
ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly());
return rm.GetString(varname);
}
public static string GetString( string varname, string taalCode )
{
string resourceName = typeof(Vertaling).Namespace + ".Resources.MyResources";
ResourceManager rm = new ResourceManager(resourceName, Assembly.GetExecutingAssembly());
return rm.GetString(varname, new CultureInfo(taalCode) );
}