Локализация интерфейса в приложениях Windows

Довольно часто возникает необходимость в разработке пользовательского интерфейса приложения с поддержкой разных национальных языков. Каждый производитель «многонационального» программного продукта по-своему решает эту задачу. Например, корпорация Microsoft просто выпускает отдельную локальную версию продукта для каждого поддерживаемого языка. Другие производители обычно в состав программного продукта включают набор файлов, содержащих текстовые сообщения для разных языков, а пользователь потом сам выбирает для работы приложения тот язык, который ему больше подходит.

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

По какому принципу работает моё решение?

Само приложение разрабатывается под какой-то один конкретный язык, например английский. Разработанная мной библиотека функций содержит специальный код, который при запуске программы с определённым параметром в командной строке, перебирает все ресурсы приложения, содержащие текст, и записывает текстовые строки в один INI-файл с указанием идентификатора ресурса для каждой строки. Далее этот INI-файл редактируется, и текст каждой строки заменяется соответствующим текстом в переводе на другой язык. Далее приложение запускается и считывает из INI-файла текстовые строки для каждого элемента интерфейса. Таким образом, оригинальный текст элементов интерфейса меняется на тот текст, который записан в INI-файле.

Так выглядит оригинал приложения с англоязычным интерфейсом…

А это то же приложение, но в русскоязычной локализации…

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

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

[ENG:IDR_MAINFRAME] 
ID_FILE_NEW=&New    Ctrl+N 
ID_FILE_OPEN=&Open...   Ctrl+O 
ID_FILE_SAVE=&Save   Ctrl+S 
ID_FILE_SAVE_AS=Save &As... 
ID_FILE_MRU_FILE1=Recent File 
$0:7=Localization 
ID_RESINI_CREATE=Create or Update 
ID_RESINI_ADDLANGUAGE=Add language... 
ID_RESINI_CHOICELANGUAGE=Select language... 
ID_APP_EXIT=E&xit 
ID_EDIT_UNDO=&Undo       Ctrl+Z 
ID_EDIT_CUT=Cu&t      Ctrl+X 
ID_EDIT_COPY=&Copy Ctrl+C 
ID_EDIT_PASTE=&Paste      Ctrl+V 
ID_VIEW_TOOLBAR=&Toolbar 
ID_VIEW_STATUS_BAR=&Status Bar 
ID_APP_ABOUT=&About Localize... 
MAINMENU=&File;&Edit;&View;&Help 
$2:3=SubMenu 
$2:3:0=One 
ID_ONE_ITEM1=Item 1 
ID_ONE_ITEM2=Item 2 
ID_ONE_ITEM3=Item 3 
ID_SUBMENU_TWO=Two 
ID_SUBMENU_THREE=Three 
$2:3:1=Two 
ID_TWO_ITEM4=Item 4 
ID_TWO_ITEM5=Item 5 
ID_TWO_ITEM6=Item 6 
$2:3:2=Three 
ID_THREE_ITEM7=Item 7 
ID_THREE_ITEM8=Item 8 
ID_THREE_ITEM9=Item 9
[ENG:IDD_ABOUTBOX] 
CAPTION=About Localize 
IDC_STATIC_VERSION=Localize Version 1.0 
IDC_STATIC_COPYRIGHT=Copyright (C) 2008 
IDOK=OK

[ENG:IDD_LOCALIZE_FORM] 
IDC_STATIC_TODO=TODO: Place form controls on thisdialog. 
IDC_BUTTON_FIRST=First 
IDC_BUTTON_SECOND=Second 
IDC_STATIC_GROUP=Edit group 
IDC_COPYRIGHT=Copyright (c) Vitaliy Rychkov 
IDC_BITMAP_BUTTON=IDB_BITMAP_EN

А это описание тех же ресурсов, но для русского языка:

[RUS:IDR_MAINFRAME] 
ID_FILE_NEW=&Создать      Ctrl+N 
ID_FILE_OPEN=&Открыть...    Ctrl+O 
ID_FILE_SAVE=&Сохранить     Ctrl+S 
ID_FILE_SAVE_AS=Сохранить &как... 
ID_FILE_MRU_FILE1=Recent File 
$0:7=INI-файл ресурсов 
ID_RESINI_CREATE=Создать или обновить 
ID_RESINI_ADDLANGUAGE=Добавить локализацию... 
ID_RESINI_CHOICELANGUAGE=Выбор языка... 
ID_APP_EXIT=В&ыход 
ID_EDIT_UNDO=&Вставить      Ctrl+Z 
ID_EDIT_CUT=Вы&резать      Ctrl+X 
ID_EDIT_COPY=&Копирование     Ctrl+C 
ID_EDIT_PASTE=&Вставка      Ctrl+V 
ID_VIEW_TOOLBAR=&Панель инструментов 
ID_VIEW_STATUS_BAR=&Строка состояния 
ID_APP_ABOUT=&О программе... 
MAINMENU=&Файл;&Правка;&Вид;&Справка
$2:3=Подменю 
$2:3:0=Один 
ID_ONE_ITEM1=Позиция 1 
ID_ONE_ITEM2=Позиция 2 
ID_ONE_ITEM3=Позиция 3 
$2:3:1=Два 
ID_TWO_ITEM4=Позиция 4 
ID_TWO_ITEM5=Позиция 5 
ID_TWO_ITEM6=Позиция 6 
$2:3:2=Три 
ID_THREE_ITEM7=Позиция 7 
ID_THREE_ITEM8=Позиция 8 
ID_THREE_ITEM9=Позиция 9

[RUS:IDD_ABOUTBOX] 
CAPTION=О программе 
IDC_STATIC_VERSION=Локализация версия 1.0 
IDC_STATIC_COPYRIGHT=Разработка (C) 2008 
IDOK=OK

[RUS:IDD_LOCALIZE_FORM] 
IDC_STATIC_TODO=СЮДА: Разместить элементы формы на этом диалоге. 
IDC_BUTTON_FIRST=Первая 
IDC_BUTTON_SECOND=Вторая 
IDC_STATIC_GROUP=Группа редактирования 
IDC_COPYRIGHT=Автор (c) Виталий Рычков 
IDC_BITMAP_BUTTON=IDB_BITMAP_RU

Если данный INI-файл отсутствует в каталоге запуска программы, то программа использует тот интерфейс, который находится у неё в ресурсах, т.е. выглядит таким образом, как она была создана в оригинале.Среди функций библиотеки по локализации приложения имеется функция загрузки строки из INI-файла с учётом выбранного языка. Тогда текст сообщения в окне диалога будет представлен на том языке, который выбран текущим.

Имеется так же возможность добавить в INI-файл другой язык (локализацию) из списка, представленного операционной системой Windows:

Для страниц свойств есть специальная функция, которая меняет текст закладок с учётом выбранного языка.

Примерно так будет выглядеть интерфейс приложения на белорусском языке:

Демонстрационный пример приложения можно загрузить отсюда: localize.zip

Исходный код данного проекта находится здесь: localize_src.zip