Многоезична поддръжка за .Net
Многоезичността на едно приложение с потребителски интерфейс се определя от:-
Конвертирането на динамични данни към текст (дати, валути и т.н.).
-
Ресурсните данни - те са статични и се превеждат преди компилация на приложението. Това са:
- текстови съобщения
- изображения и икони - може да съдържат текстова информация или да имат знаме и т.н.
- звуци - може да е човешки говор, химн или нещо друго
- промени, породени от предишните точки: в контролите (размери, позиции, подредба и т.н.) и във формите
Съдържанието на .resx файловете може да се разглежда като Hashtable, т.е. като последователност от наредени двойки ключ - стойност. Ключът е текстов низ (може да се нарече идентификатор или име). Стойността е от един от петте предефинирани типа данни или от допълнително дефиниран тип.
При компилация .resx файловете стават .resources (посредством resgen.exe), които са готови двоични файлове за вграждане в асембли (чрез al.exe). По подразбиране за многоезичност се използва техниката със сателитни асемблита. Microsoft Visual Studio създава по едно такова асембли за всяка използвана култура (култура е комбинацията от език и държава/регион).
Когато в дизайн-тайм на форма се зададе стойност true на пропъртито Localizable, се разрешава чрез пропъртито Language да се създават / променят ресурси за различни езици. Не редактирайте директно тези ресурси, тъй като те се редактират от дизайн-тайм-а на формата. Промени, направени директно върху ресурсен файл на форма ще бъдат заличени при следващо отваряне на формата в дизайн-тайм! Всяко пропърти на формата и на всичко в нея, което е с атрибут Localizable ще се слага в ресурсен файл за текущо активния език на формата, вместо да се слага в дизайнер сорс файловете (Designer.cs, Designer.vb и т.н.).
За да се използва стандартния механизъм на Microsoft за многоезичност, имената на ресурсните файлове и на сателитните асемблита трябва да са точно определени. За форма с име MyForm езиково инвариантният ресурс е MyForm.resx, а ресурсът за български - MyForm.bg-BG.resx. Аналогично за ресурс с име MyResource.resx българският му вариант е MyResource.bg-BG.resx. Сателитното асембли, съдържащо тези ресурси трябва да е в поддиректория с име "bg-BG" спрямо програмата. Повтарящият се стринг "bg-BG" се нарича име на култура и се определя като "[език]-[държава/регион]".
Определянето на културата, която задава кое сателитно асембли (кой ресурс) ще се използва става посредством Thread.CurrentThread.CurrentUICulture. Определянето на културата, според която дати, валути и т.н. динамични данни ще се конвертират до текст става посредством Thread.CurrentThread.CurrentCulture.
Да допуснем, че трябва да хвърлим Exception с текст, който може да се покаже на потребителя по някакъв начин. Това е езиково-специфичен тескт и за да поддържаме многоезичност трябва да направим:
- Добавяне на въпросният текст в ресурсен файл.
- Употреба на автоматично генерираното пропърти вместо стринга, когато се хвърля Exception-а.