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, повторно добавит все пропущенные переводы, если они были выполнены, когда переводчик переводил.