Глобализация существующего приложения Windows Forms?

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Кроме того, вот несколько других вопросов StackOverflow по этой теме:

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

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

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

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

Ответ 4

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

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