От: Разни въпроси към WEB-аджиите...
За езиците аз се отказах от вградените възможности на VS.NET и ползвам прости текстови файлове в INI формат (защото си предпочитам олдскул програмирането), които са елементарни за промяна от хора, които не им е работа да знаят какво е XML например. Имаме по един файл за всеки език, например lang-bg.txt, lang-en.txt, lang-de.txt.
При логване лузера му се показват не само полета за име и парола, но и последно ползвания език, с който той е влизал в приложението. Това се пази в бозата, за това няма проблем. Възможните езици за превод може да се показват в някакъв комбо бокс, за да може да си избере друг, ако иска. Ако лузера се логва за пръв път и в базата няма инфо какъв език е ползвал, то му се предлага някакъв дефолтен език - например английски.
За всяка форма, страница или просто някакви съобщения си дефинирам нова секция и разбираеми имена на променливи в INI файла. Давам текстовия файл на преводача и той ми го връща готов. След време се правят корекции след реално преглеждане как стоят съобщенията в даденото приложение. Самият клас, който се занимава с многоезичната поддръжка, има два режима: с кеширане на данните от тези файлове или винаги чете дадения превод от съответния файл, т.е. промяната в превода се вижда при рефреш на страницата или наново отваряне на формата (зареждам разните текстове за превод при лоадване на форма/страница). Така много лесно и бързо се оправят синтактични грешки в текстовете, изцяло замяна на преведени съобщения заради смисъла им и т.н. При изчистване на грешките в текстовете за ускоряване се пуска кеширането в паметта и така се подобрява леко скоростта (не че се вижда на новите машини, ама за собствено успокоение ).
Ето и пример как изглеждат част от файл с преводи при мен:
Последният превод (cur_part_info) съдържа параметри и се попълва вече от самото приложение, например със string format:
По подобен начин се ползва и при web-ско приложение:
И предполагам веднага се вижда предимството на тези текстови файлове. Те могат да се ползват от различни приложения, правени с различни платформи и така няма да има нужда за различни версии на дадено приложение да се мислят различни методи за многоезична поддръжка.
За езиците аз се отказах от вградените възможности на VS.NET и ползвам прости текстови файлове в INI формат (защото си предпочитам олдскул програмирането), които са елементарни за промяна от хора, които не им е работа да знаят какво е XML например. Имаме по един файл за всеки език, например lang-bg.txt, lang-en.txt, lang-de.txt.
При логване лузера му се показват не само полета за име и парола, но и последно ползвания език, с който той е влизал в приложението. Това се пази в бозата, за това няма проблем. Възможните езици за превод може да се показват в някакъв комбо бокс, за да може да си избере друг, ако иска. Ако лузера се логва за пръв път и в базата няма инфо какъв език е ползвал, то му се предлага някакъв дефолтен език - например английски.
За всяка форма, страница или просто някакви съобщения си дефинирам нова секция и разбираеми имена на променливи в INI файла. Давам текстовия файл на преводача и той ми го връща готов. След време се правят корекции след реално преглеждане как стоят съобщенията в даденото приложение. Самият клас, който се занимава с многоезичната поддръжка, има два режима: с кеширане на данните от тези файлове или винаги чете дадения превод от съответния файл, т.е. промяната в превода се вижда при рефреш на страницата или наново отваряне на формата (зареждам разните текстове за превод при лоадване на форма/страница). Така много лесно и бързо се оправят синтактични грешки в текстовете, изцяло замяна на преведени съобщения заради смисъла им и т.н. При изчистване на грешките в текстовете за ускоряване се пуска кеширането в паметта и така се подобрява леко скоростта (не че се вижда на новите машини, ама за собствено успокоение ).
Ето и пример как изглеждат част от файл с преводи при мен:
Код:
;----- SELECT PART FILE FORM ----------------------------------------- [SelectPartFileForm] BTN_OK = OK BTN_CANCEL = Cancel FORM_TITLE = Select document attached to the current part number LBL_SELECT_FILE_DESCR = Please select file linked to current part number. LBL_CUR_PART = No active part number set! CHK_REPLACE_ALL_INST = Replace all instances CUR_PART_INFO = Part Code: {0}, Rev: {1}, Description: {2}
Код:
lblCurPart.Text = String.Format(GetLangString("SelectPartFileForm", "CUR_PART_INFO"), _ PDMObj.CurrentPartName, PDMObj.CurrentPartRev, PDMObj.CurrentPartDescription)
Код:
lblErrorStartsOn.InnerText = CurrLang.GetLangString("Common Texts", "LABEL_DATE_EMPTY_ERROR");
Коментар