Каковы наилучшие практики для создания многоязычных приложений на win32?

StackOverflow https://stackoverflow.com/questions/490297

Вопрос

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

1) Какой предпочтительный (по умолчанию?) способ заставить приложение автоматически выбирать нужный язык ресурса без вмешательства пользователя?Есть какие-нибудь образцы?

2) Каковы мои варианты, позволяющие пользователю / приложению контролировать, на каком языке оно должно отображаться?

3) Если возможно, как мне создать dll, которая содержала бы несколько языковых ресурсов, а затем динамически выбирать язык?

Это было полезно?

Решение

Для # 1 вы можете использовать GetSystemDefaultLangID функция для получения идентификатора языка для компьютера.

Для # 2 вы могли бы перечислить поддерживаемые вами языки и, когда пользователь выберет один, записать выбранный в текстовый файл или реестр (есть ли реестр в Windows Mobile?).При запуске используйте функцию в # 1 только в том случае, если в файле или реестре нет выбора.

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

Другие советы

Ре 1: Предыдущее предложение GetSystemDefuaultLangID является хорошим.

Ре 2: Вы можете задать этот вопрос в качестве первого шага в вашей установке.Или вы можете упаковать разные установщики для каждого языка.

Ре 3: Теоретически упомянутый выше метод DLL звучит великолепно, однако на практике лично для меня он работал не очень хорошо.

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

MessageBox(Localize("Hello"), Localize("Title"), MB_OK);
RegOpenKey(NoLocalize("\\SOFTWARE\\RegKey"), ...);

Localize - это просто функция, которая преобразует ваш текст на английском языке в текст на выбранном языке.NoLocalize ничего не делает.

Однако вы хотите окружить свои строки этими значениями, потому что вы можете создать пару полезных скриптов на выбранном вами языке сценариев.

1) Скрипт, который выполняет поиск всех префиксов Localize(" и выводит файл .ini с парами значений english=otherlangauge name.Если файл output .ini уже содержит сопоставление, вы не добавляете его снова.Вы никогда не воссоздаете ini-файл полностью, ваш скрипт просто добавляет недостающие при каждом запуске вашего скрипта.

2) Скрипт, который выполняет поиск по всем строкам и проверяет, что они окружены либо Localize(", либо NoLocalize(".Если нет, то он сообщает вам, какие строки вам все еще нужно локализовать.

Причина № 2 важна в том, что вам нужно убедиться, что все ваши строки действительно сознательно помечены как нуждающиеся в локализации или нет.В противном случае абсолютно невозможно убедиться, что у вас правильная локализация.

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

Вы отправляете ini-файлы, которые выводятся вместе с вашей программой.Вы также передаете эти ini-файлы своим переводчикам, чтобы они могли конвертировать пары английский = другой язык.Когда они отправят его вам обратно, вы просто замените свой зарегистрированный ini-файл на тот, который предоставлен вашим переводчиком.Запуск вашего скрипта, как указано в # 1, повторно добавит все недостающие переводы, если таковые были сделаны во время перевода переводчиком.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top