Многоезична поддръжка за .Net

       Многоезичността на едно приложение с потребителски интерфейс се определя от:
  1. Конвертирането на динамични данни към текст (дати, валути и т.н.).

  2. Ресурсните данни - те са статични и се превеждат преди компилация на приложението. Това са:
    • текстови съобщения
    • изображения и икони - може да съдържат текстова информация или да имат знаме и т.н.
    • звуци - може да е човешки говор, химн или нещо друго
    • промени, породени от предишните точки: в контролите (размери, позиции, подредба и т.н.) и във формите
       Ресурсите се държат в xml файлове с разширение .resx. Има пет предефинирани типа данни, които може да съдържа ресурсен файл: текстови низове, изображения, икони, аудио файлове и файлове с данни (третирани като последователност от байтове). Отделно, ресурсният файл може да съдържа допълнително специфицарини типове данни.

       Съдържанието на .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 с текст, който може да се покаже на потребителя по някакъв начин. Това е езиково-специфичен тескт и за да поддържаме многоезичност трябва да направим:
  1. Добавяне на въпросният текст в ресурсен файл.
  2. Употреба на автоматично генерираното пропърти вместо стринга, когато се хвърля Exception-а.
       Тъй като това е тромава и еднообразна работа, а с текст се борави доста често, има плъгин за Visual Studio, който автоматизира тези две операции - ResourceRefactor. В Exception-а се изписва самият текст с езика по подразбиране (например английски), след което с плъгина се указва текстът да отиде в даден ресурсен файл и да бъде заменен със сътоветно генерираното пропърти.