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

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

Сега трябва да глобализираме това приложение. Двата локала са немски и японски.

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

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

Също така сме използвали някои съставни низове на някои места в кода, за да свържем низовете на съобщенията, как те могат да бъдат локализирани?

Ще мигрираме приложението към VS 2008 и .net framework 3.5, преди да започнем дейността по глобализация.


person ksa    schedule 05.10.2009    source източник


Отговори (4)


Работил съм само с LTR езици, а японски не съм пипал. Имайки това предвид, ето някои от моите най-добри практики на главата ми:

  • Поставете всички специфични за езика програмни низове и фрагменти от низове в .resx файл (обичам да използвам по един .resx файл на диалогов прозорец), след което извикайте низовете, като използвате автоматично генерираните класове и свойства. Във вашия код не трябва да остават низове, специфични за езика (което означава почти никакви низове във вашия код, точка). Добър модел е да поставите форматиращи низове и в .resx, тъй като синтаксисът на езика варира.
  • Задайте свойството Localizable на True на всички ваши формуляри и направете специфични за езика промени там директно (използвайте свойството Language).
  • Проектирайте формулярите си така, че всичко, което показва специфични за езика низове, да има допълнително място, където е необходимо (забележка: немският е по-дълъг от английския). IMO, формулярите не трябва да се пренареждат напълно за основна промяна в езика - може да се наложи обаче да се направи с език като японски.
  • За контроли като етикети, които се нуждаят от динамично зададен текст, задайте текста във формуляра, така че да знаете, че е само маркер. Използвам "##" за това, което наистина се откроява. Избягвайте да задавате текста на "извадка" от динамичния текст, защото никога няма да си спомните кои контроли се задават динамично само като погледнете формуляра.
person Jon Seigel    schedule 05.10.2009
comment
Благодаря. Бих искал да знам възможностите за поддръжка и скалируемост с този подход, ако нещо се промени или текстът трябва да бъде модифициран във файла с ресурси. Или ако искам да разширя това на още един език, как ще бъде постигнато, ако приложението вече е в производство? Изисква ли повторно компилиране и повторно разполагане. - person ksa; 06.10.2009
comment
С този подход ще трябва да прекомпилирате и преразпределите основния изпълним файл както за добавяне, така и за промяна, да. Но ще трябва да разположите отново нещо с всяка проста многоезична реализация. Не виждам това като проблем, защото езиковите низове трябва да бъдат проверени за правопис/граматика далеч преди да бъдат пуснати, а добавянето на нов език, който клиентът иска, трябва да бъде сравнително рядко явление. - person Jon Seigel; 06.10.2009
comment
В нашето приложение се изисква добавяне на нова езикова поддръжка. Така че, ако няма промяна в приложението с изключение на езика, можем да създадем нов .resx файл, да генерираме сателитна сборка и да я поставим в подходящата структура на директория. Това няма да изисква повторно компилиране, прав ли съм? Още един въпрос е преводът на въведените потребителски данни, къде и как да поддържаме това, ако имаме някои данни, които да се споделят между потребители от различни локали? - person ksa; 07.10.2009
comment
Ще трябва да направите допълнителна абстракция, за да извлечете низове от сателитните модули, но трябва да работи както искате. MSDN вероятно има някои намеци за този подход. Ще ви е необходим и механизъм, който да позволи на потребителя да избере езика по избор от наличните (или той ще бъде в конфигурационен файл). Преводът на потребителски данни е цяла отделна дискусия и ще искате да направите някои независими изследвания въз основа на вашите бизнес нужди. - person Jon Seigel; 07.10.2009

По-добре е да зададете свойството за локализация на всеки формуляр -- което ще извлече не само низовете, но и геометрията на различните компоненти в основния .resx файл. При номинираните езици е доста малко вероятно оригиналните размери на компонентите да са подходящи за превода.

Обикновено не се препоръчва да съставяте низове от фрагменти, защото те по принцип няма да се преобразуват в същия модел от фрагменти на различен език. Използване на форматирани низове (String.Format) за намаляване на стойностите, да, но всичко, което разчита на граматиката и реда на изреченията на оригиналния език, е малко вероятно да пасне.

person Steve Gilham    schedule 05.10.2009

Ако използвате Visual Source Safe като контрола на източника (да се надяваме, че не сте), каквото и да правите, не добавяйте японски текст в самия изходен код. Въпреки че Visual Studio може да обработва уникод изходни файлове, VSS не се справя добре с тях.

Работих върху приложение, което се преведе на японски и включването на японски в самия изходен код (за извиквания на подобна на MessageBox функция) повреди файловете и тъй като VSS е базиран на diff, файловете бяха повредени докрай обратно към оригиналните чекирани версии. Тази повреда прие формата на повечето кодови файлове, които бяха превърнати в безсмислици, базирани на японски знаци, и се случи, защото VSS измести части от базираните на unicode CS файлове (които използваха два байта на знак) с един байт.

Коригирането на тези файлове изискваше много ръчна работа, а шефът ми надничаше през рамото ми и крещеше колко сме обречени, така че просто не правете това.

Също така, ето няколко други въпроса на StackOverflow по тази тема:

Най-добрият начин за прилагане на многоезичност/глобализация в голям .NET проект

Най-добра практика за създаване на многоезично приложение в C#/WinForms ?

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

Използването на вградените методи за глобализация е много работа, защото трябва ръчно да създадете всеки глобализиран формуляр и след това ръчно да замените целия текст с преводите, а тази задача до голяма степен изисква програмистът да владее свободно. Методът, който споменавам, се извършва програмно и не изисква програмистът да владее свободно преведените езици.

person MusiGenesis    schedule 05.10.2009
comment
трябваше да крещиш на шефа си, че няма резервно копие на място. крещи му дори на френски, с японски субтитри. - person Timmerz; 12.09.2012
comment
Ние имахме резервно копие на място - наричаше се Visual Source Safe. Никога не бих очаквал нещо подобно да може да повреди хранилище чак до оригиналния регистриран файл. - person MusiGenesis; 12.09.2012
comment
явно не разбираш концепцията за архивиране. - person Timmerz; 12.09.2012
comment
@Timmerz: наистина ли смятате, че е разумно да заключите, че 17-годишен ветеран в програмирането не разбира концепцията за архивиране въз основа на изхвърлен коментар? Или просто се упражняваш да бъдеш глупак? Защото не мисля, че имате нужда от практиката. - person MusiGenesis; 12.09.2012
comment
Щях да те уволня веднага. арогантен и без много разум. защо не погледнеш този линк? support.microsoft.com/kb/244016 - person Timmerz; 12.09.2012
comment
Както казах, нямате нужда от практиката. - person MusiGenesis; 13.09.2012
comment
вместо да се занимавате с проблема, вие го заобикаляте и просто ме нападате и се връщате към собствената си автобиография. нека бъда наистина ясен тук... ако смятате, че визуалните източници са безопасни за вашето архивиране и то се повреди по този начин и не можете да го запазите, може просто да сте унищожили напълно компания. това не е резервно копие. Наистина се опитвам да проумея как може да си толкова невеж след 17 години. - person Timmerz; 13.09.2012
comment
Извинявам се, че използвам луксозен курсив и че поставям под съмнение експертните ви познания относно архивирането. Благодаря ви, че ми посочихте колко още имам да науча за този бизнес. - person MusiGenesis; 14.09.2012
comment
хаха извинението е прието! Видях, че пишеш нещо другаде за архивиране на sql сървър, така че предполагам, че всъщност знаеш как да архивираш ;-) - person Timmerz; 14.09.2012

Ако искате общността да локализира вместо вас, използвайте външен XML файл. Погледнете http://www.codeplex.com/url2jpeg, този проект с отворен код е локализиран по този начин и използва Reflection за автоматично локализиране на формата.

За низ просто използвайте скрит етикет.

person Remi THOMAS    schedule 05.10.2009