Вопрос

Вставка локализируемых данных

Нужно генерировать записи справочника, и к ним локализируемые данные.

Сейчас делаю с помощью классов Insert в основную таблицу и отдельно таблицу локализации.

Но нужно через Entity, чтобы работала событийная модель.

Система вставляет одинаковые строки в основную таблицу, и одну запись в таблицу локализации (для культуры текущего пользователя).

 

Можно ли как-то явно задавать языки?

Например

- Англ.язый - значение А,

- Рус.язык - значение Б,

- Укр.язык - значение В

Нравится

5 комментариев
Лучший ответ

Зверев Александр,

Да спасибо. Это оно. Но я уже позже нашел еще более удобный способ. 

Можно сразу при создании entity в метод 

SetColumnValue передавать значением LocalizableString.

 

LocalizableString value = new LocalizableString();
var uk = CultureInfo.CreateSpecificCulture("uk-UA");
var ru = CultureInfo.CreateSpecificCulture("ru-RU");
var en = CultureInfo.CreateSpecificCulture("en-US");
value.SetCultureValue(uk, "Період тест");
value.SetCultureValue(ru, "Период тест");
value.SetCultureValue(en, "Period test");
 
var entity = _userConnection.EntitySchemaManager.GetInstanceByName("Period").CreateEntity(_userConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("StartDate", new DateTime(2020, 11, 08));
entity.SetColumnValue("DueDate", new DateTime(2020, 11, 10));
entity.SetColumnValue("PeriodTypeId", new Guid("83140788-D3F8-4DCC-9497-1D6ECE36F2DB"));
entity.SetColumnValue("Name", value);
entity.Save();

 

 

Добрый день.

 

Можно. Справочник культур (языков) называется SysCulture.

Алла Савельева,

Либо я не понял ответ. Либо вы не поняли вопрос.



Например:

Нужно создать запись в справочник Месяцы.

3 значения установить в БД к одной записи November, Ноябрь, Листопад.

Перефразирую:

Можно ли как-то явно задавать строки в разных локализациях при сохранении Entity?

Владислав, для изменения значений текстового поля в разных локализациях в CommonUtilities есть функция:

public static void SaveLocalizableValue(Entity entity, LocalizableString localizableValue, string columnName) {
	if (UseMultilanguageData) {
		return;
	}
	var userConnection = entity.UserConnection;
	var entitySchemaManager = userConnection.EntitySchemaManager;
	var query = new EntitySchemaQuery(entitySchemaManager, "SysCulture");
	var idColumnName = query.AddColumn("Id").Name;
	var nameColumnName = query.AddColumn("Name").Name;
	var sysCultures = query.GetEntityCollection(userConnection);
	string lczSchemaName = entity.Schema.GetLocalizableStringsSchemaName();
	var lczSchema = entitySchemaManager.GetInstanceByName(lczSchemaName);
	foreach (var sysCulture in sysCultures) {
		string cultureName = sysCulture.GetTypedColumnValue<string>(nameColumnName);
		var culture = CultureInfo.GetCultureInfo(cultureName);
		string lczValue = string.Empty;
		if (!localizableValue.HasCultureValue(culture)) {
			lczValue = localizableValue.GetCultureValue(GeneralResourceStorage.CurrentCulture);
		} else {
			lczValue = localizableValue.GetCultureValue(culture);
		}
		Guid cultureId = sysCulture.GetTypedColumnValue<Guid>(idColumnName);
		Guid columnUId = entity.Schema.Columns.FindByName(columnName).UId;
		Entity newLczValueEntity = lczSchema.CreateEntity(userConnection);
		newLczValueEntity.SetDefColumnValues();
		newLczValueEntity.FetchFromDB(new Dictionary<string, object> {
			{"SysCulture", cultureId},
			{"Record", entity.PrimaryColumnValue},
			{"ColumnUId", columnUId},
		});
		newLczValueEntity.SetColumnValue("SysCultureId", cultureId);
		newLczValueEntity.SetColumnValue("ColumnUId", columnUId);
		newLczValueEntity.SetColumnValue("Value", lczValue);
		newLczValueEntity.SetColumnValue("RecordId", entity.PrimaryColumnValue);
		newLczValueEntity.Save();
	}
}

В неё передаются Entity, название поля и объект типа LocalizableString, где хранятся строки на всех нужных языках. Они задаются его методом:

public override void SetCultureValue(CultureInfo culture, string value)

Тут CultureInfo — стандартный класс от Microsoft.

Зверев Александр,

Да спасибо. Это оно. Но я уже позже нашел еще более удобный способ. 

Можно сразу при создании entity в метод 

SetColumnValue передавать значением LocalizableString.

 

LocalizableString value = new LocalizableString();
var uk = CultureInfo.CreateSpecificCulture("uk-UA");
var ru = CultureInfo.CreateSpecificCulture("ru-RU");
var en = CultureInfo.CreateSpecificCulture("en-US");
value.SetCultureValue(uk, "Період тест");
value.SetCultureValue(ru, "Период тест");
value.SetCultureValue(en, "Period test");
 
var entity = _userConnection.EntitySchemaManager.GetInstanceByName("Period").CreateEntity(_userConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("StartDate", new DateTime(2020, 11, 08));
entity.SetColumnValue("DueDate", new DateTime(2020, 11, 10));
entity.SetColumnValue("PeriodTypeId", new Guid("83140788-D3F8-4DCC-9497-1D6ECE36F2DB"));
entity.SetColumnValue("Name", value);
entity.Save();

 

 

Показать все комментарии