Локализация

Доброго времени суток!

Столкнулся с такой ситуацией. Для справочного поля в sql-запросе select через left join я выходил на "Название" значения (вместо айди, которое по умолчанию). Но, как выяснилось с помощью "Sys{объект}Lcz", отображались в запросе значения из другой локализации справочника, не "ru-RU". И на данный момент установлено у меня 2 локализации: RU и EN.



Вопрос. Можно ли как-то избавится от иной локализации вовсе, оставив русскую соответственно? Ну или убрать для уже существующих в системе объектов иную локализацию?

П.с. Мои коллеги подсказали, что, убрав локализацию, это повысило бы чутка быстродействие системы.

Изображение удалено.

Нравится

5 комментариев

Здравствуйте.

 

Их можно выключить, отключив признак "активный". Это, а также список всех языков в системе можно увидеть в Languages разделе в дизайнере системы. 

Я бы не рекомендовал удалять английскую культуру, это может за собой повлечь проблемы в работе системы, которые сразу сложно предугадать. К тому же, в приложении почти всё завязывается на анг. культуру. Если бы речь шла об удалении Испанского или Иврита, то последствий было бы меньше или вовсе никаких. 

Скрипты есть, но выполнять их стоит на свой страх и риск. Скрипт удаляет все языки, которые не используются в профиле пользователей и который не является основным. 

Если всё же вы решитесь удалять анг. культуру, сделайте копию приложения и удалите её там. После чего проверьте работу приложения в разделах, компиляцию, генерацию кода, установку пакетов - по максимуму провести тестирование. 

 

IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL

       DROP Table #UsedCultures

-- Получение списка используемых культур

SELECT DISTINCT cult.Id

INTO #UsedCultures

FROM SysCulture cult

INNER JOIN SysAdminUnit au

       ON au.SysCultureId = cult.Id

INSERT INTO #UsedCultures

    (Id)

SELECT

    SysSettingsValue.GuidValue

FROM

    SysSettingsValue

INNER JOIN SysSettings

    ON SysSettings.Id = SysSettingsValue.SysSettingsId

WHERE

    SysSettings.Code = 'PrimaryCulture'

-- Получение списка таблиц, из которых нужно удалять данные

DECLARE TableNamesCursor CURSOR FOR

SELECT

        t3.TABLE_NAME AS ChildTableName  

FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS t1 

        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t2 ON t1.UNIQUE_CONSTRAINT_NAME = t2.CONSTRAINT_NAME

        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t3 ON t1.CONSTRAINT_NAME = t3.CONSTRAINT_NAME

WHERE

       t2.TABLE_NAME = 'SysCulture'

       and t2.COLUMN_NAME = 'Id'

       and t3.COLUMN_NAME = 'SysCultureId'

DECLARE @TableName SYSNAME

OPEN TableNamesCursor

FETCH NEXT FROM TableNamesCursor INTO @TableName

WHILE @@FETCH_STATUS = 0  

BEGIN  

       PRINT @TableName

       DECLARE @Sql NVARCHAR(MAX);

       SET @Sql = 'DELETE FROM ' + @TableName + '

            WHERE SysCultureId NOT IN (SELECT Id FROM #UsedCultures)';

       PRINT @Sql

       EXECUTE sp_executesql @Sql

       FETCH NEXT FROM TableNamesCursor INTO @TableName

END

CLOSE TableNamesCursor

DEALLOCATE TableNamesCursor

DELETE FROM SysCulture

WHERE Id NOT IN (SELECT Id FROM #UsedCultures)

IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL

       DROP Table #UsedCultures

K.Ivan,

здравствуйте!



Нет, удалять англ. культуру не собираемся.



Проблема в том, что меняются данные в таблице локализации, а не в таблице справочника.

Не подскажете, как обеспечить сохранение данных в справочнике, а не в таблице локализации? Или как привязать таблицу локализации объекта к пакету?



И после Вашего ответа я поставил на русской культуре признак "по умолчанию", с англ. признак убрался, но признак "активный" на англ. культуре не даёт снять (серый чекбокс).

Английскую культуру деактивировать полностью невозможно, серый чекбокс - это нормальное поведение. 

 

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

Доброго дня коллеги, а есть такой скрипт для PostgreSQL?

Носуля Роман Викторович,



Роман, добрый день!

 

BEGIN;

-- Получение списка используемых культур

CREATE TEMP TABLE "UsedCultures" ON COMMIT DROP AS

SELECT DISTINCT cult."Id"

FROM "SysCulture" cult

INNER JOIN "SysAdminUnit" au

ON au."SysCultureId" = cult."Id";

INSERT INTO "UsedCultures" ("Id")

SELECT "SysSettingsValue"."GuidValue"

FROM "SysSettingsValue"

INNER JOIN "SysSettings"

ON "SysSettings"."Id" = "SysSettingsValue"."SysSettingsId"

WHERE "SysSettings"."Code" = 'PrimaryCulture';

-- Получение списка таблиц, из которых нужно удалять данные

DO $$

DECLARE

TableNamesCursor REFCURSOR;

TableName varchar;

BEGIN

OPEN TableNamesCursor FOR

SELECT kcu.TABLE_NAME

FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu

INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc

ON ccu.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG

AND ccu.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA

AND ccu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu

ON kcu.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG

AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA

AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME

WHERE ccu.COLUMN_NAME = 'Id'

AND ccu.TABLE_SCHEMA = 'public'

AND ccu.TABLE_NAME = 'SysCulture';

--Удаление локализаций

LOOP

FETCH TableNamesCursor INTO TableName;

EXIT WHEN TableName IS NULL;

RAISE NOTICE 'Deleting from table %', TableName;

EXECUTE format('DELETE FROM %I WHERE "SysCultureId" NOT IN (SELECT "Id" FROM

"UsedCultures")', TableName);

END LOOP;

CLOSE TableNamesCursor;

END $$;

DELETE FROM "SysCulture"

WHERE "Id" NOT IN (SELECT "Id" FROM "UsedCultures");

COMMIT

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