Локализация в приложении C#

Я создаю Приложение C# на основе WinForms / KryptonForms, и поскольку приложение является промежуточным в разработке, я думал мне, я лучше всего улаживаю локализацию.

Поскольку перенесенный и воспитанный PHP программист (и я знаю C#, является совершенно новым уровнем), я создал бы класс для обнаружения языка, и автоматический присваивают пакет языка приложению. и затем используйте объекты языка получить доступ к значениям.

Я задаюсь вопросом, могу ли я получить некоторые примеры на самом легком / Лучшие методы выполнения этого.

Я лично хотел бы что-то вроде Параметров настройки приложения

Где обычно я делал бы MyApplication.Properties.Settings.Default.SomeKey Я надеялся a MyApplication.Languages.Current.ApplicationTitle и MyApplication.Languages.en.ApplicationTitle например.

Также, только загружая единственный ресурс на файл языка для улучшения скорости было бы выгодно также.

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

Каковы Ваши мысли об этом?


Править:

Приложение основано на Протоколах XMPP и пользуется agsXMPP Библиотеками. От моего понимания каждого пользователя, который отправляет меня, их присутствие должно также отправить язык, их система идет.

Так в основном, если существует какой-либо способ "схватить" факт хранения отдельного слова и использования __("some string") в моем приложении было бы возможно, но тем временем я просто смотрю на текст GUI.

10
задан TylerH 3 May 2016 в 15:42
поделиться

3 ответа

Мы выполняем локализацию следующим образом:

  • Установите для свойства WinForm "Localizable" значение true (что создаст новый файл ресурсов для этой формы, содержащий, например, текст меток, кнопок, а также z-порядок и т. д.)
  • Создайте FormName.de.resx («de», потому что мы немецкие), а затем сохраняем в нем строки, которые необходимо будет локализовать (доступ к этому файлу ресурсов осуществляется через класс ResourceManager)
  • Что касается кода, отличного от WinForms, который требует для локализации мы просто создаем отдельные файлы ресурсов

После компиляции вашего приложения создается AppName.resources.dll. Эта dll содержит все ресурсы вашего приложения и затем может использоваться с такими инструментами, как Visual Localize, для перевода строк на другой язык, например английский, испанский и т. Д.

8
ответ дан 4 December 2019 в 00:59
поделиться

Вы должны использовать ресурсы.

Вы можете изменять язык динамически:

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();
}
2
ответ дан 4 December 2019 в 00:59
поделиться

Мы используем 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) );
    }
1
ответ дан 4 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: