Лучшая практика для создания многоязычного приложения в С#/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