Глобализировать существующее приложение Windows Forms? - PullRequest
10 голосов
/ 05 октября 2009

У меня есть приложение winforms, разработанное с использованием VS 2005 и .net framework 2.0.

Теперь нам нужно глобализировать это приложение. Два языка - немецкий и японский.

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

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

Кроме того, мы использовали несколько составных строк в некоторых местах кода для объединения строк сообщений, как их можно локализовать?

Мы будем мигрировать приложение в VS 2008 и .net Framework 3.5 перед началом действий по глобализации.

Ответы [ 4 ]

7 голосов
/ 05 октября 2009

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

  • Поместите все программные строки и фрагменты строк для конкретного языка в файл .resx (мне нравится использовать один файл .resx на диалоговое окно), затем вызовите строки, используя автоматически сгенерированные классы и свойства. В вашем коде не должно оставаться строк, зависящих от языка (что означает, что в вашем коде практически нет строк, точка). Хорошим примером является размещение строк форматирования и в .resx, поскольку синтаксис языка различен.
  • Установите для свойства Localizable значение True во всех ваших формах и внесите в него изменения, относящиеся к конкретному языку (используйте свойство Language).
  • Создайте формы так, чтобы все, что отображало строки для конкретного языка, имело дополнительное пространство, где это необходимо (примечание: немецкий язык длиннее английского). ИМО, формы не должны быть полностью переставлены для базового изменения языка - это может быть сделано с таким языком, как японский.
  • Для таких элементов управления, как метки, для которых требуется динамический набор текста, установите текст в форме так, чтобы вы знали, что это всего лишь маркер. Я использую "##" для этого, который действительно выделяется. Избегайте установки текста в качестве «образца» динамического текста, потому что вы никогда не будете помнить, какие элементы управления устанавливаются динамически, просто посмотрев на форму.
2 голосов
/ 05 октября 2009

Лучше установить свойство локализации в каждой форме - это будет извлекать не только строки, но и геометрию различных компонентов, в базовый файл .resx. С назначенными языками весьма маловероятно, что исходные размеры компонентов хорошо подойдут для перевода.

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

1 голос
/ 05 октября 2009

Если вы используете Visual Source Safe в качестве источника контроля (надеюсь, что нет), что бы вы ни делали, не не добавляет японский текст внутри самого исходного кода. Хотя Visual Studio может обрабатывать исходные файлы Unicode, VSS не справляется с ними.

Я работал над приложением, которое переводило себя на японский язык, и включение японского языка в сам исходный код (для вызовов функции, похожей на MessageBox) повредило файлы, а поскольку VSS основан на diff, файлы были повреждены вплоть до исходных версий. Это искажение приняло форму того, что большинство файлов кода превратились в японскую символьную тарабарщину, и произошло из-за того, что VSS сместил части файлов CS на основе юникода (которые использовали два байта на символ) на один байт.

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

Кроме того, вот еще пара вопросов StackOverflow по этой теме:

Лучший способ реализовать многоязычность / глобализацию в большом проекте .NET

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

Лично я предпочитаю более простой метод. Создайте список в Excel или что-то из каждого фрагмента текста на английском языке в приложении, которое вам нужно перевести (контролировать свойства текста, строки для использования в функциях MessageBox и т. Д.), И отправьте электронные таблицы вашим переводчикам. В вашем приложении вызовите метод в событии Load каждой из ваших форм, который перебирает все элементы управления в форме и изменяет их свойства Text на переведенные значения. Замените все вызовы MessageBox вызовами промежуточной функции, которая переводит отображаемый текст, а затем вызывает MessageBox с переведенным текстом.

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

0 голосов
/ 05 октября 2009

Если вы хотите, чтобы сообщество локализовало для вас, используйте внешний файл XML. Посмотрите на http://www.codeplex.com/url2jpeg, этот проект с открытым исходным кодом локализован таким образом и использует Reflection для автоматической локализации формы.

Для строки просто используйте скрытый ярлык.

...