Раздел «Технологии программирования».MultiLangInCSharp:

Локализация программ на C#

Это руководство посвящено тому, как средствами C# и Visual Studio просто обеспечить поддержку вашей программой нескольких языков. Сразу хотел бы заметить, что если уж вы решили писать свой проект с поддержкой нескольких языков, то лучше делать это по ходу написания кода, а не оставлять на потом. Позже процедура «интернализации» потребует значительно больших усилий, особенно в крупных проектах.

Шаг 1

Для того чтобы не писать полные имена классов, добавим в наш проект следующие строки:


using System.Resources;
using System.Globalization;
using System.Threading;

Шаг 2

Далее необходимо добавить в проект собственно ресурс со строками: File → Add New Item → Assembly Resource File. Назовём его, скажем, myResource.resx.

Шаг 3

Заполняем myResource.resx. Этот шаг вы будет выполнять постоянно по ходу написания кода: появляются новые строковые данные (названия пунктов меню, заголовки кнопок, сообщения об ошибках и т.п.) – добавляете их в ресурс. Добавление информации в ресурс состоит в добавление пары: name – value. name – это название строки, несёт смысловую нагрузку, к примеру «button1Text», а value – это конкретная реализация данной строки для конкретного языка, например «Press on me» для английского и «Нажми на меня» для русского. Рисунок ниже иллюстрирует шаг 3 для одного из моих проектов.

Шаг 4

Необходимо создать объект ResourceManager в вашей форме, добавив следующие строки:


private ResourceManager     myResourceManager = new ResourceManager("namespace1.myResource", System.Reflection.Assembly.GetExecutingAssembly());
private CultureInfo myEnglishCulture = new CultureInfo("en-US");

namespace1 – это тот namespace, в котором вы работаете. myResource – название ресурса, который мы создали на втором шаге. Для каждого поддерживаемого языка необходимо создать объект CultureInfo, что мы и делаем. Пока указана поддержка только одного языка: английского. Каждому языку соответствует свой код. Американскому английскому – «en-US», русскому – «ru-RU», коды других языков вы можете посмотреть в MSDN.

Шаг 5

Создаём функцию в updateUI(), которая отвечает за изменение языка интерфейса.


private void updateUI()
{
   button1.Text = myResourceManager.GetString("button1Text");
   // Обновление других элементов управления, переменных и т.д.
   ...
}

Вот вы и видите конструкцию, которой вам придётся пользоваться постоянно. Думаю, смысл её понятен без пояснений. Кроме того, везде в коде, где нужно указать зависящую от языка строку используйте эту конструкцию: myResourceManager.GetString("button1Text"). Замечу, что часто удобно к полученной строке применять метод String.Format(…) – обратите на него внимание.

Шаг 7

В конец функции InitializeComponent() добавьте написанную функцию updateUI().

Шаг 8

Когда вы решите добавить поддержку другого языка (например, русского), просто добавьте новый ресурс: File → Add New Item → Assembly Resource File, но назвать его необходимо myResource.ru-RU.resx. Это локализованная версия нашего файла myResource.resx. Добавление информации в него, происходит, как и в шаге 3, только, конечно, поле value теперь заполняется на другом (в нашем случае русском) языке. И не забудьте добавить в место, указанное в шаге 4 строку:

System.Reflection.Assembly.GetExecutingAssembly());
private CultureInfo myRussianCulture = new CultureInfo("ru-RU");

Шаг 9

И последнее. Как же нам реагировать на переключение пользователем языка? Вот как:


// При выборе английского
Thread.CurrentThread.CurrentUICulture = myEnglishCulture;
updateUI();

//При выборе русского
Thread.CurrentThread.CurrentUICulture = myRussianCulture;
updateUI();

Удачи!

Vassiliy Tarasov, vass@7ka.miptNOSPAM.ru

Attachment sort Action Size Date Who Comment
localiztion.zip manage 35.1 K 20 May 2005 - 15:33 VassiliyTarasov2? Эта статья в формате RTF