Лучшая практика для создания многоязычного приложения на C # / WinForms? [закрыто]

94

Я искал приложения, подходящие для нескольких языков на C #, так как мне нужно работать над небольшим проектом, где это так. Я нашел в основном два способа сделать это:

Установите для свойства Localizable формы значение true, установите свойство Language, заполните все метки и тому подобное, и все готово. Главный недостаток, который я вижу в этом: как сделать другие вещи, не являющиеся частью формы, готовыми для нескольких языков (например, всплывающие окна, файлы журналов или окна и т. Д.).

Создайте файл ресурсов, например «Lang.en-us.resx» и по одному для каждого языка, например «Lang.nl-nl.resx», и заполните его строками. Кажется, что среда IDE автоматически генерирует для меня класс, поэтому в коде я могу просто использовать Lang.SomeText. Самый большой недостаток, который я вижу в этом, заключается в том, что для каждой формы мне нужно самому установить все метки и другие подписи в коде (и, похоже, привязка данных не работает с этими ресурсами).

Я уверен, однако, что есть и другие способы сделать это.

Итак, что лучше всего? Что проще всего для небольших приложений (несколько форм, подключение к базе данных и т. Д.) И что лучше всего масштабируется для более крупных приложений?

Михай Лимбэцан
источник
3
Я заметил, что неконструктивный (или другой тип вопросов типа «не подходит для SO») - один из самых ценных вопросов :) Это тоже хороший вопрос (я думаю, что голоса это доказывают) Вот хорошая демонстрация того, как использовать многоязычную надстройку для многоязычной поддержки youtube.com/watch?v=SNIyP1QQdVs
Prokurors
1
Иногда так сложно собрать воедино все фрагменты знаний, имеющихся в Интернете, и сейчас я считаю этот вопрос бесценным. Конечно, бывают случаи, когда закрытие мягких вопросов менее конструктивно, чем оставлять их открытыми, и я думаю, что это один из таких случаев. :)

Ответы:

20

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

Я использовал два разных способа:

  • Файл ресурсов в форме
  • Файл глобальных ресурсов

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

Глобальный файл ресурсов позволяет централизовать все метки (изображения и т. Д.) В одном файле (для каждого языка), но это означает ручную настройку меток в загрузке формы. Этот файл также можно использовать для сообщений об ошибках и т. Д.

Вопрос вкуса ...

И последнее: я пишу программы на английском и французском языках, я использую «en» и «fr», а не «en-US» и «fr-FR». Не усложняйте ситуацию, разные диалекты английского языка (американский, английский, австралийский и т. Д.) Имеют достаточно мало различий, чтобы использовать только один (то же самое и для французского).

ThatBloke
источник
2
Иногда приходится беспокоиться о диалектах. Например, китайские иероглифы полностью отличаются в традиционном китайском (Тайвань) от упрощенного китайского (материковый Китай).
MarkJ
1
В документации @MarkJ MSDN упоминается, что традиционный китайский и упрощенный китайский - это не диалекты (страна / регион), а нейтральные культуры. Msdn: «Нейтральная культура - это культура, которая связана с языком, но не со страной / регионом. Конкретная культура - это культура, которая связана с языком и страной / регионом. Например,« fr »является нейтральным культура, а "fr-FR" - это определенная культура. Обратите внимание, что "zh-CHS" (упрощенный китайский) и "zh-CHT" (традиционный китайский) являются нейтральными культурами ".
широкополосный
Я недавно сделал это с помощью ссылки , 2 шага, не упомянутых там: 1. Щелкните все файлы .resource и установите для свойства «Build Action» значение «Content». 2. Щелкните все файлы .resource и установите для свойства «Копировать в выходной каталог» значение «Всегда копировать».
Sourav
1
@Kiquenet Полный (с кодом) ответ, включая широкую поддержку .NET, см .: stackoverflow.com/a/35813707/2901207
CularBytes 01
9

Недавно я написал программу с поддержкой немецкого и английского языков. Я был удивлен, обнаружив, что если я просто назвал свои английские ресурсы LanguageResources.resx и мои немецкие ресурсы LanguageResources.de.resx, он автоматически выбрал правильный язык. ResXFileCodeGenerator позаботился обо всем за меня.

Обратите внимание, что поля в двух файлах были одинаковыми, и любые еще не введенные поля для немецкого языка будут отображаться в приложении как английские, поскольку файл по умолчанию является наиболее нестандартным языком. При поиске строки она идет от наиболее конкретной (например, .de-DE.resx) к наименее конкретной (например, .resx).

Чтобы добраться до ваших строк, используйте вызовы ResourceManager.GetString или ResourceManager.GetObject. Приложение должно предоставить вам ResourceManager бесплатно.

Рик Минерих
источник
6

Для тех, кто может столкнуться с этим (спустя 1+ лет после последней публикации), я являюсь автором профессионального продукта локализации, который упрощает весь процесс перевода. Это надстройка Visual Studio, которая извлекает все строки «.resx» из любого произвольного решения и загружает их в один файл, который можно перевести с помощью бесплатного автономного приложения (переводчики могут загрузить это с моего сайта). Затем та же надстройка импортирует переведенные строки обратно в ваше решение. Чрезвычайно прост в использовании с множеством встроенных средств защиты, множеством наворотов и онлайн-справкой (она вам не понадобится). См. Http://www.hexadigm.com

Ларри
источник
1
Это должно быть добавлено как встроенная функция в visualstudio! Отличный софт!
Каверна,
Большое спасибо (признателен). Я бы согласился с вами, прежде чем запускать продукт (около 10 лет назад), но если бы MSFT внедрила его сегодня, это выбило бы меня из бизнеса :)
Ларри