Это своего рода общий вопрос, открытый для мнений. Я пытаюсь разработать хороший способ разработки локализации строковых ресурсов для приложения Windows MFC и связанных с ним утилит. Мой список пожеланий:
- Необходимо сохранить строковые литералы в коде (в отличие от замены с помощью идентификатора ресурса макроса #define), чтобы сообщения были все еще доступны для чтения inline
- Должен разрешить локализованные строковые ресурсы (duh)
- Не следует устанавливать дополнительные ограничения среды выполнения (например: зависимость от .NET и т.д.).
- Должен иметь минимальную привязку к существующему коду (чем меньше модификация, тем лучше)
- Должно быть отлаживаемым
- Должен генерировать файлы ресурсов, которые можно редактировать обычными инструментами (то есть: общий формат)
- Не следует использовать блоки комментариев для копирования/вставки для сохранения литеральных строк в коде или что-либо еще, что создает потенциал для десинхронизации
- Было бы неплохо разрешить статическую (компиляцию) проверку, что каждая "нотная" строка находится в файле ресурсов.
- Было бы неплохо разрешить пул строк на разных языках (для компонентов на разных языках, например: родной С++ и .NET).
У меня есть способ, который в какой-то степени выполняет весь мой список пожеланий, за исключением статической проверки, но для этого мне пришлось разработать немного пользовательского кода (и у него есть ограничения). Мне интересно, если кто-то решил эту проблему особенно хорошо.
Изменить: Решение, которое я сейчас просматриваю, выглядит следующим образом:
ShowMessage( RESTRING( _T("Some string") ) );
ShowMessage( RESTRING( _T("Some string with variable %1"), sNonTranslatedStringVariable ) );
Затем у меня есть специальная утилита для синтаксического анализа строк из блоков "RESTRING" и поместить их в файл .resx для локализации и отдельный объект С# COM, чтобы загрузить их из локализованных файлов ресурсов с помощью резервного копирования. Если объект С# недоступен (или не может загрузить), я возвращаюсь к строке в коде. Макрос расширяется до класса шаблона, который вызывает COM-объект, выполняет форматирование и т.д.
В любом случае, я подумал, что было бы полезно добавить то, что у меня есть сейчас для справки.