SharePoint 2010/2013. Локализация данных
В SharePoint существует механизм локализации, позволяющие использовать ресурсы для задания имен сайтов, списков, библиотек, полей и прочего. К тому же, если существует поле, используемое другим списком при подстановке, то и в этом случае локализация работает отлично. Атрибут ShowField также умеет принимать строки для выбора значений из ресурсных файлов.
"Побочным эффектом" такого поведения SharePoint является то, что можно локализовать не только название полей, но и сами данные. Сегодня небольшой пример, как это сделать.
Суть решения
В определении lookup-поля есть атрибут ShowField, который указывает на поле, отображаемое из списка. Трюк заключается в том, чтобы, используя локализацию, ссылаться на разные поля для разных локалей пользователя. Т.е. в списке мы храним разные значения для разных языков и отображаем одно из них в зависимости от языка пользователя.
Атрибут ShowField
Для начала посмотрим как используется атрибут ShowField в классе Microsoft.SharePoint.SPFieldLookup:
- public string get_LookupField()
- {
- if (!this.bShowFieldSet)
- {
- if (this.m_strShowField == null)
- {
- string fieldAttributeValue = base.GetFieldAttributeValue("ShowField", 0x20);
- this.m_strShowField = SPUtility.GetLocalizedString(
- fieldAttributeValue,
- "core",
- (uint) CultureInfo.CurrentUICulture.LCID);
- }
- this.bShowFieldSet = true;
- }
- return this.m_strShowField;
- }
Перед тем как вернуть значение, SharePoint пытается получить по нему значение из ресурсного файла.
Определение списка и ресурсы
Декларация списка в части полей выглядит примерно так:
- <Fields>
- <Field
- Type="Text"
- ID="{GUID}"
- Name="ValueEng"
- DisplayName="$Resources:MultiLigualRes,ValueEng;" />
- <Field
- Type="Text"
- ID="{GUID}"
- Name="ValueRus"
- DisplayName="$Resources:MultiLigualRes,ValueRus;" />
- </Fields>
Для примера я использовал два языка: русский и английский. При желании можно расширить список поддерживаемых языков, добавив для каждого отдельный столбец.
Ресурсы я создал, исходя из логики, что для русского интерфейса отображаем русское значение, для остальных - английское значение:
Список с двуязычными значениями готов, теперь переходим к его использованию.
Lookup-поле
Определение для lookup-поля, которое отображает разные значения в зависимости от языка:
- <Field
- Type="Lookup"
- ID="{2637608e-39a7-43a8-8e4b-ed1deda749d5}"
- Name="MultiLingualLookup"
- ShowField="$Resources:MultiLigualRes,LocLookupField;"
- DisplayName="$Resources:MultiLigualRes,ValueLookup;"
- List="Lists/DemoList" />
И суть решения в подстановке разных полей из ресурсов:
Результат
При добавлении этого поля в список мы имеем мультилингвальное поле в списке. Вот так оно выглядит на форме редактирования (слева - русский язык, справа - английский язык):
И вот так в представлении списка:
При реализации мультилингвальных решений не всегда надо реализовывать кастомные формы для отображения данных в зависимости от языка и прочее. Зачастую достаточно стандартного функционала и минимум своего кода.