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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 29 января 2009

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

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

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

3 голосов
/ 29 января 2009

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

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

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

Лучший способ - окружить все строки в вашей программе: Localize или NoLocalize.

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

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

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

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

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

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

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

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

...