Локализация в приложении C # - PullRequest
9 голосов
/ 14 июля 2010

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

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

Мне интересно, могу ли я получить некоторые примеры самых простых / лучших способов сделать это.

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

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

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

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

Что вы думаете об этом?


Edit:

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

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

Ответы [ 3 ]

7 голосов
/ 14 июля 2010

Как мы делаем локализацию:

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

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

2 голосов
/ 14 июля 2010

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

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

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();
}
1 голос
/ 14 июля 2010

Мы используем Resources.MyResources.SomeString, который автоматически переводится на нужный язык.Файлы ресурсов называются MyResources.de-DE.resx, MyResources.nl-BE.resx и т. Д. Тот же метод, что и у свойств проекта.может сделать это вручную, как:

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) );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...