среда, 5 сентября 2012 г.

Создание многоязычного сайта в Composite C1 CMS (6). Перевод форм

Самый простой способ создания форм в Composite C1 CMS - с использованием специального пакета расширения Forms Renderer.
В двух словах, вы создаете тип данных. А затем представляете его поля на странице сайта с помощью функции Composite.Forms.Renderer, которая появляется у вас после установки одноименного пакета расширения.


Функция имеет один главный параметр - тип данных, который нужно использовать с этой формой, а также несколько необязательных, но полезных параметров (например, отсылка уведомления по электронной почте о заполнении формы пользователем).


Надписи полей формы на странице - это надписи полей указанного типа данных. А сообщения, появляющиеся при неправильном заполнении поля формы - это текст справки поля этого типа данных, а если его нет - то стандартное сообщение .NET Framework для такого типа поля.

Типы полей в форме являются эквивалентами виджетов, которые используются для соответствующих полей в типе данных. Но, к сожалению, не все виджеты поддерживаются такой формой. Например, селекторы страниц и медиа-файлов - не поддерживаются, но это вполне логично.

Обычно, когда вы создаете тип данных, то надпись и текст справки для конкретного его поля вы указываете на подходящем вам языке. Если же вы используете  Forms Renderer для форм на страницах, то надписи и сообщения для полей будут показаны именно на этом языке. То есть, если посетитель сайта переключит язык на вашем сайте, надписи и сообщения в такой форме останутся на оригинальном языке, что никак не устроит ни пользователя, ни вас.


Но для этого предусмотрена локализация таких форм:
  • Локализация форм, созданных с помощью Forms Renderer, осуществляется  с помощью строк из ресурсных файлов, которые вам нужно будет создать отдельно для каждого языка на вашем сайте.
  • А в полях "Надпись" и "Справка" вместо строк на одном языке используется специальный синтаксис вызова нужной строки из соответствующего файла.
Создание типа данных и формы

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


Она создана с помощью Forms Renderer на основе типа данных Demo.Messages с такими полями:
  • Имя: Title
  • Надпись: Заголовок
  • Справка: Укажите заголовок вашего сообщения.
  • Тип: Строка (64)
  • Обязательное: Да
  • Виджет: TextBox

  • Имя: Message
  • Надпись: Сообщение
  • Справка: Напишите сообщение.
  • Тип: Строка (512)
  • Обязательное: Да
  • Виджет: TextArea
И вы уже добавили форму на страницу с помощью функции Composite.Forms.Renderer.

Создание ресурсных файлов для строк на разных языках

Теперь вам нужно поместить строки из "Надписи" и "Справки" в ресурсный файл для языка по умолчанию. Условимся, что язык по умолчанию у нас - английский,  а второй язык сайта - русский.

Я рекомендую использовать Visual Studio для создания и редактирования ресурсных файлов.
  1. Открываем наш веб-сайт в Visual Studio.
  2. Добавляем в корневую папку сайта папку ~/App_GlobalResources, если ее нет (правый клик на корневой папке сайта / Add ASP.NET FolderApp_GlobalResources)
  3. Создаем ресурсный файл (.resx) в этой папке под названием "Forms.resx": ~/App_GlobalResources/Forms.resx. Это файл для строк на английском языке.
  4. Добавляем в него нашу строку по английски:
    1. Name: ContactFormTitleLabel / Value: Title
    2. Name: ContactFormTitleHelp / Value: Specify the title of your message
    3. Name: ContactFormMessageLabel / Value: Message
    4. Name: ContactFormMessageHelp / Value: Write your message

  5. Теперь делаем копию этого файла, но добавляем в его название суффикс "ru-ru" для русского языка (или соответствующий суффикс для нужного языка): ~/App_GlobalResources/Forms.ru-ru.resx. В этой копии у нас уже есть нужные нам строки, только по-английски.
  6. Переведем значения этих строк с английского на русский:
    1. Name: ContactFormTitleLabel / Value: Заголовок
    2. Name: ContactFormTitleHelp / Value: Укажите заголовок вашего сообщения
    3. Name: ContactFormMessageLabel / Value: Сообщение
    4. Name: ContactFormMessageHelp / Value: Напишите вашe сообщение

А теперь воспользуемся этими строками в соответствующих свойствах полей нашего типа данных.

Использование локализированных строк в типе данных

Для вызова строки из ресурсного файла вам следует использовать такой синтаксис:

${Resource, Resources.<имя ресурсного файла>.<имя строки>}

Причем имя ресурсного файла не включает в себя расширение и код языка. В нашем случае оно будет "Forms": ${Resource, Resources.Forms.<имя строки>}
  1. Откройте тип данных "Demo.Messages" на редактирование.
  2. На вкладке "Поля" выберите поле "Title".
    1. В свойстве "Надпись" вставьте:  ${Resource, Resources.Forms.ContactFormTitleLabel} 
    2. В свойстве "Справка":  ${Resource, Resources.Forms.ContactFormTitleHelp} 
  3. Теперь выберите поле "Message".
    1. В свойстве "Надпись" вставьте:  ${Resource, Resources.Forms.ContactFormMessageLabel} 
    2. В свойстве "Справка":  ${Resource, Resources.Forms.ContactFormMessageHelp}
  4. Сохраните изменения.

А теперь можете проверять,  как будет выглядеть форма на странице на одном языке и на другом.

На английском:


На русском:


Локализация кнопки Submit

Кстати, и  кнопку "Submit" на форме можно локализировать подобным образом:
  1. Добавьте в ресурсные файлы строку для текста на этой кнопке, что-то вроде:
    1. Forms.resx:  Name: SubmitButton / Value: Submit
    2. Forms.ru-ru.resx:  Name: SubmitButton / Value: Отправить
  2. Вызовите диалог свойств функция Composite.Forms.Renderer на той странице, где она вставлена.
  3. В параметр Send Button Label переключите на "Константу" и в поле ниже вставьте: ${Resource, Resources.Forms.SubmitButton} (или так, как вы назвали строку)
  4. Нажмите ОК и сохраните/опубликуйте страницу
Замечу, что если вы уже перевели страницу с формой, то вам нужно будет проделать указанные выше шаги отдельно для страниц с этой формой на  каждом языке.


Предыдущие сообщения:
Читайте также:

1 комментарий: