Для кого ця стаття

У першу чергу, ця стаття призначена розробникам програмних
компонентів для платформи. NET, що підтримують інтернаціоналізацію.
Стаття буде корисна для всіх, хто працює з. NET, використовуючи файли
ресурсів і функції типу String.Format.

Приклад завдання, використовуваної для демонстрації

Ми маємо програму Windows Forms, яка повинна підтримуватимуть 3
мови: англійська, італійська та російська. Зокрема, у рядку
стану програми повинна виводитися рядок: "Дата: {поточне число}"
мовою локалі користувача.

Рішення від Microsoft

Microsoft в такому разі рекомендує зробити наступне:

  1. Створити по одному. Resx файлу для кожного з підтримуваних
    мов для зберігання строкових ресурсів.
  2. Додати в кожний з цих файлів рядок із загальним ідентифікатором
    ресурсу, наприклад "IDS_DATE", з текстом, відповідним мови.
    Наприклад, для англійської версії, ТЕКТ буде "Date: {0}".
  3. Написати приблизно наступний код:
string messageTemplate = resourceManager.GetString ("IDS_DATE");
string finalMessage = string.Format (messageTemplate, new DateTime ());
/ / Оновлення тексту в рядку стану

ПРИМІТКА
Здавалося б, усе добре, але поглянемо на цей код уважніше:

  1. Якщо змінити ім'я ідентифікатора в ресурсах або помилитися в
    написанні цього імені в коді, то компілятор не видасть помилки, тому що в
    коді це ім'я записується у вигляді рядка.
  2. Найчастіше рядкові ресурси – це шаблони повідомлень, що містять
    декілька параметрів, а тому самі шаблони оголошені в іншому файлі,
    це створює додатковий ризик того, що кількість або
    послідовність параметрів при подальшому форматуванні шаблону
    будуть неузгодженості.

ResxWrap – як засіб усунення подібних недоліків

Саме для вирішення цих проблем була створена утиліта ResxWrap –
генератор класів-обгорток для текстових ресурсів з. resx файлів.
Класи-обгортки надають користувачеві можливість працювати з
ресурсами в набагато більш зручною манері. Для вищеописаного прикладу
досить написати:

string finalMassage = generatedWrapper.IDS_DATE (new DateTime ());
/ / Оновлення тексту в рядку стану

Що ж змінилося?

  1. Замість двох рядків коду ми маємо одну. Не так погано скоротити
    кількість рутинного коду в два рази.
  2. Якщо назва ідентифікатора зміниться, тепер ми в
    безпеки, тому що компілятор тут же видасть помилку, оскільки у
    класу-обгортки більше не буде методу IDS_DATE.
  3. Якщо ми змінимо кількість аргументів у текстовому шаблоні
    "IDS_DATE", то теж ніяких проблем. Компілятор знову повідомить нам про
    помилку – адже сигнатура відповідного методу класу-обгортки
    зміниться теж.
  4. Редагуючи виклик цього методу можна подивитися довідку за
    кожному параметру для впевненості, що порядок їх прямування
    правильний.

Як згенерувати обгортку

ResxWrap – утиліта, керована параметрами командного рядка.
Повертаючись до нашого прикладу, припустимо, що наш проект має
простір імен за замовчуванням "SampleApp", файли проекту перебувають у
директорії "C: My ProjectsSampleApp", а файл ресурсів називається
"StringTable.resx". Тоді, щоб згенерувати клас-обгортку досить
запустити генератор з наступними параметрами:

ResxWrap SampleApp "C: My ProjectsSampleApp" StringTable

При завершенні генерації в директорії проекту з'явиться новий файл з
ім'ям "__StringTable.cs", який буде містити визначення
одноіменнного класу описаного в тому ж просторі імен.

Звичайно можна створити. Bat файл і кожного разу при зміні в
"StringTable.resx" запускати генератор знову, але для надійності краще
додати одну позицію в Pre-build Event Command Line в налаштуваннях
проекту. Для цього достатньо написати в разі нашого прикладу
наступне:

ResxWrap SampleApp $(ProjectDir) StringTable

Заглянемо всередину

Згенерований клас містить:

Якщо текстовий рядок містить параметри, то сигнатура методу буде
містити відповідну кількість параметрів, що супроводжувалися
коментарями, а тіло методу, крім завантаження шаблону текстового
повідомлення, буде також містити виклик String.Format, що готує
фінальну версію повідомлення.

Резюме

Отже, якщо ви вирішили використовувати утиліту ResxWrap при розробці
проекту, вам потрібно:

  1. додати виклик утиліти ResxWrap у файл проекту;
  2. перекомпілювати проект;
  3. додати сгенеренний файл класу-обгортки до списку файлів
    проекту;
  4. створити примірник класу-оберки;
  5. викликати відповідний метод або властивість для вилучення потрібних
    текстових ресурсів.

Ісходникі

Проект CRL Resource
Wrapper розробляється в рамках руху Open Source. Утиліта
ResxWrap доступна для вільного скачування за наступною адресою:

http://sourceforge.net/project/showfiles.php?group_id=98011&package_id=104991.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*