Лучшая практика для создания многоязычного приложения в С#/WinForms?
Я занимаюсь разработкой приложений, подходящих для нескольких языков на С#, поскольку мне нужно работать над небольшим проектом, где это так. Я нашел в основном два способа сделать это:
Задайте для свойства Localizable значение true, задайте свойство Language, заполните все ярлыки и т.д., и вы выполните "done". Главный недостаток, который я вижу в этом, заключается в следующем: как сделать другой материал, который не является частью готовой формы для нескольких языков (например, всплывающие окна, файлы журналов или окна и т.д.).
Создайте файл ресурсов, например "Lang.en-us.resx" и один для каждого языка, например "Lang.nl-nl.resx", и заполните его строками. IDE, похоже, автоматически создает класс для меня, поэтому в коде я могу просто использовать Lang.SomeText. Самый большой недостаток, который я вижу в этом, заключается в следующем: для каждой формы мне нужно установить все метки и другие субтитры в коде (и, похоже, привязка данных к этим ресурсам не работает).
Я уверен, однако, что есть и другие способы сделать это.
Итак, что такое лучшая практика? Что проще для небольших приложений (несколько форм, подключение к базе данных и т.д.) И какие масштабы лучше всего подходят для более крупных приложений?
Ответы
Ответ 1
Я всегда использовал файлы ресурсов для многоязычных приложений.
Многие статьи в Интернете объясняют, как их использовать.
Я использовал два разных способа:
- Файл ресурсов для каждой формы
- Глобальный файл ресурсов
Файл/форма ресурса проще реализовать, вам нужно всего лишь ввести значения в файле ресурсов, но я считаю, что этот подход сложнее поддерживать, поскольку метки распределены по всему приложению.
Глобальный файл ресурсов позволяет централизовать все метки (изображения и т.д.) в одном файле (на каждый язык), но это означает, что вручную устанавливаются метки в загрузке формы. Этот файл также можно использовать для сообщений об ошибках и т.д.
Вопрос вкуса...
Один последний момент, я пишу программы на английском и французском языках, я использую "en" и "fr", а не "en-US" и "fr-FR". Не усложняйте что-то, разные дилелекты английского (американского, английского, австралийского и т.д.) Имеют немного достаточных различий, чтобы использовать только один (то же самое касается французского).
Ответ 2
Недавно я написал программу с поддержкой как немецкого, так и английского языков. Я был удивлен, узнав, что если я просто назвал свои английские ресурсы LanguageResources.resx и мои немецкие ресурсы LanguageResources.de.resx, он автоматически выбрал правильный язык. ResXFileCodeGenerator позаботился обо всем этом.
Обратите внимание, что поля в двух файлах совпадают, и все еще не введенные немецкие поля будут отображаться в приложении на английском языке, так как самым нестандартным файловым языком является файл по умолчанию. При поиске строки он переходит от наиболее специфического (ex.de-DE.resx) к наименее конкретному (например,.resx).
Чтобы получить в ваших строках, используйте вызовы ResourceManager.GetString или ResourceManager.GetObject. Приложение должно предоставить вам ResourceManager бесплатно.
Ответ 3
В интересах других, которые могут столкнуться с этим (через 1+ лет после последнего поста), я являюсь автором профессионального продукта локализации, который делает весь процесс перевода чрезвычайно простым. Это надстройка Visual Studio, которая извлекает все строки ".resx" из любого произвольного решения и загружает их в один файл, который может быть переведен с использованием бесплатного автономного приложения (переводчики могут загрузить его с моего сайта). Такая же надстройка будет импортировать переведенные строки обратно в ваше решение. Чрезвычайно прост в использовании со многими встроенными средствами защиты, множеством колоколов и интерактивной справкой (вам это не понадобится). См. http://www.hexadigm.com