Локализация в приложении C#
Im создание приложения C# на основе WinForms / KryptonForms,и поскольку приложение находится на полпути в разработке, я подумал, что лучше всего отсортировать локализацию.
как рожденный и воспитанный программист PHP (и я знаю, что C# - это совершенно новый уровень), я бы создал класс для обнаружения языка и автоматического назначения языкового пакета приложению. а затем используйте объекты language для доступа к значениям.
мне интересно, могу ли я получить некоторые примеры на простой / лучшие методы этого.
Я лично хотел бы что-то в соответствии с настройками приложения
где обычно я бы сделал MyApplication.Properties.Settings.Default.SomeKey
Я надеялся на MyApplication.Languages.Current.ApplicationTitle
и MyApplication.Languages.en.ApplicationTitle
например.
также было бы полезно загружать только один ресурс на языковой файл для повышения скорости.
таким образом, языковые нагрузки на английском языке, испанский пользователь продвигается, что это приложение находится в Английский, хотел бы он изменить его на испанский язык, он нажимает да, настройки обновляются, и приложение перезапускается и загружает единый испанский языковой пакет.
что вы думаете об этом?
Edit:
приложение основано на протоколах XMPP и использует библиотеки agsXMPP. Из моего понимания каждый пользователь, который отправляет мне свое присутствие, также должен отправить язык, на котором находится их система.
Итак, если есть любой способ "схватить" факт хранения одного слова и использования __("some string")
в моем приложении было бы возможно, но в то же время я просто смотрю на текст GUI.
3 ответов
способ локализации:
- установите свойство "Localizable" - WinForm в true (которое будет генерировать новый файл ресурсов для этой формы, содержащий, например, текст меток, кнопок, а также Z-порядок и т. д.)
- создайте имя формы.de.resx-файл ("de", потому что мы немцы), а затем сохраните строки, которые должны быть локализованы там (доступ к этому ресурсному файлу работает через класс ResourceManager)
- как для кода non-WinForms который необходимо локализовать, мы просто создаем отдельные файлы ресурсов
при компиляции вашего приложения, AppName.ресурсы.созданный 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 мы можем снова открыть форму для применения ресурсов локализации (используйте локализуемые и язык свойства в конструкторе форм для автоматической генерации ресурсов для каждого языка):
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();
}
мы используем ресурсы.Файла myresources.SomeString, который автоматически переводится на правильный язык. Файлы ресурсов называются MyResources.де-де.resx, MyResources.НЛ-Бе.resx etc. Тот же метод, что и свойства проекта в основном.
пример кода перевода:
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) );
}