четверг, 10 мая 2012 г.

Локализация стандартных текстов интерфейсов в управляемом приложении

В рабочей базе существуют русскоязычные пользователи (восточный и южный регион) и украиноязычные (западный регион и тру украинцы). При украинизации текстов интерфейсов столкнулся с проблемою редактирования надписей на стандартных элементах интерфейсов форм (Записать и закрыть, сохранить, сформировать и т.д.). Нашел 2 выхода из ситуации - устанавливать язык приложения при установке украинским или динамически изменять надписи и всплывающие подсказки при создании форм. Если кому будет полезно - второй способ решения проблемы описан ниже. 1. Документы и справочники. Для документов и справочников необходимо украинизировать заголовки стандартных действий объекта и действия в табличных частях:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если Не ОбщийМодульСервер.ЯзыкПриложения() = Метаданные.Языки.Русский Тогда
        // Локализация заголовков кнопок
        ОбщийМодульСервер.ЛокализацияЗаголовковВОбъекте(ЭтаФорма, Объект);
        ОбщийМодульСервер.ЛокализацияЗаголовковТабличныхЧастей(ЭтаФорма, ЭтаФорма.Элементы.Таблица1);
        ОбщийМодульСервер.ЛокализацияЗаголовковТабличныхЧастей(ЭтаФорма, ЭтаФорма.Элементы.Таблица2);
    КонецЕсли;

КонецПроцедуры
Для форм списка документов и справочников украинизация немного отличается но объединена в одну процедуру. Различия составляет только проведение документов, отбор документов по периоду и иерархичность справочников.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если ОбщийМодульСервер.ЯзыкПриложения() = Метаданные.Языки.Русский Тогда
        ОбщийМодульСервер.ЛокализацияЗаголовковВСписке(ЭтаФорма);
    КонецЕсли;

КонецПроцедуры
2. Отчеты. Локализация отчетов предусматривает изменение заголовков стандартных действий и отборов СКД. К сожалению без решения остается локализация контекстного меню табличного документа.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Если ОбщийМодульСервер.ЯзыкПриложения() = Метаданные.Языки.Русский Тогда
        ОбщийМодульСервер.ЛокализацияЗаголовковВОтчете(ЭтаФорма);
        ОбщийМодульСервер.ЛокализацияЗаголовковОтбораСКД(ЭтаФорма);
    КонецЕсли;

КонецПроцедуры
Описание общего модуля ОбщийМодульСервер (Сервер, Вызов сервера):

&НаСервере
Процедура ЛокализацияЗаголовковВОбъекте(Форма, Объект) Экспорт

    Если ЯзыкПриложения() = Метаданные.Языки.Русский Тогда
        Возврат;
    КонецЕсли;

    ВидОбъектаМетаданных = ПолучитьВидОбъектаМетаданных(Объект.Ссылка);

    // Командная панель табличной части
    // Кнопки для всех объектов - документы и справочники
    СтруктураКнопок = Новый Структура;
    СтруктураКнопок.Вставить("Записать"     , НСтр("Ukr = 'Записати'"));
    СтруктураКнопок.Вставить("Перечитать"   , НСтр("Ukr = 'Перечитати'"));
    СтруктураКнопок.Вставить("Скопировать"  , НСтр("Ukr = 'Скопіювати'"));
    СтруктураКнопок.Вставить("ИзменитьФорму", НСтр("Ukr = 'Змінити форму'"));
    СтруктураКнопок.Вставить("Справка"      , НСтр("Ukr = 'Довідка'"));
    СтруктураКнопок.Вставить("Удалить"      , НСтр("Ukr = 'Видалити'"));
    СтруктураКнопок.Вставить("УстановитьПометкуУдаления", НСтр("Ukr = 'Встановити помітку видаленя'"));

    // Кнопки документов
    Если ВидОбъектаМетаданных = "Документ" Или ВидОбъектаМетаданных = Неопределено Тогда
        СтруктураКнопок.Вставить("Проведение"       , НСтр("Ukr = 'Проведення'"));
        СтруктураКнопок.Вставить("Провести"         , НСтр("Ukr = 'Провести'"));
        СтруктураКнопок.Вставить("ПровестиИЗакрыть" , НСтр("Ukr = 'Провести та закрити'"));
        СтруктураКнопок.Вставить("ОтменаПроведения" , НСтр("Ukr = 'Відміна проведення'"));
        СтруктураКнопок.Вставить("СоздатьНаОсновании", НСтр("Ukr = 'Створити на підставі'"));
    КонецЕсли;

    // Кнопки справочников
    Если ВидОбъектаМетаданных = "Справочник" Или ВидОбъектаМетаданных = Неопределено Тогда
        СтруктураКнопок.Вставить("ЗаписатьИЗакрыть" , НСтр("Ukr = 'Записати та закрити'"));
    КонецЕсли;

    // Установка заголовков
    Для Каждого Кнопка Из СтруктураКнопок Цикл
        ЛокализацияЗаголовка(Форма.Элементы, "Форма"+Кнопка.Ключ, Кнопка.Значение);
    КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ЛокализацияЗаголовковТабличныхЧастей(Форма, ТабличнаяЧасть) Экспорт

    Если ЯзыкПриложения() = Метаданные.Языки.Русский Тогда
        Возврат;
    КонецЕсли;

    // Командная панель табличной части
    СтруктураКнопок = Новый Структура;
    СтруктураКнопок.Вставить("Добавить"     ,НСтр("Ukr = 'Додати'"));
    СтруктураКнопок.Вставить("Скопировать"  ,НСтр("Ukr = 'Скопіювати'"));
    СтруктураКнопок.Вставить("Изменить"     ,НСтр("Ukr = 'Змінити'"));
    СтруктураКнопок.Вставить("Удалить"      ,НСтр("Ukr = 'Видалити'"));
    СтруктураКнопок.Вставить("Найти"        ,НСтр("Ukr = 'Знайти'"));
    СтруктураКнопок.Вставить("ОтменитьПоиск",НСтр("Ukr = 'Відмінити пошук'"));
    СтруктураКнопок.Вставить("Переместить"  ,НСтр("Ukr = 'Перемістити'")); //Группа
    СтруктураКнопок.Вставить("Сортировка"   ,НСтр("Ukr = 'Сортування'")); // Группа
    СтруктураКнопок.Вставить("ВывестиСписок",НСтр("Ukr = 'Вивести список...'"));
    СтруктураКнопок.Вставить("ПереместитьВниз",НСтр("Ukr = 'Перемістити вниз'"));
    СтруктураКнопок.Вставить("ПереместитьВверх",НСтр("Ukr = 'Перемістити вгору'"));
    СтруктураКнопок.Вставить("ЗакончитьРедактирование",НСтр("Ukr = 'Закінчить редагування'"));
    СтруктураКнопок.Вставить("СортироватьСписокПоУбыванию",НСтр("Ukr = 'Сортувати за зменшенням'"));
    СтруктураКнопок.Вставить("СортироватьСписокПоВозрастанию",НСтр("Ukr = 'Сортувати за збільшенням'"));

    Для Каждого Кнопка Из СтруктураКнопок Цикл
        ЛокализацияЗаголовка(Форма.Элементы, ТабличнаяЧасть.Имя+Кнопка.Ключ, Кнопка.Значение);
    КонецЦикла;

    // Контекстное меню табличной части
    СтруктураКнопок = Новый Структура;
    СтруктураКнопок.Вставить("Добавить"     ,НСтр("Ukr = 'Додати'"));
    СтруктураКнопок.Вставить("Изменить"     ,НСтр("Ukr = 'Змінити'"));
    СтруктураКнопок.Вставить("ВыделитьВсе"  ,НСтр("Ukr = 'Копіювати все'"));
    СтруктураКнопок.Вставить("Переместить"  ,НСтр("Ukr = 'Перемістити'")); //Группа
    СтруктураКнопок.Вставить("Скопировать"  ,НСтр("Ukr = 'Скопіювати'"));
    СтруктураКнопок.Вставить("Удалить"      ,НСтр("Ukr = 'Видалити'"));
    СтруктураКнопок.Вставить("ПереместитьВниз",НСтр("Ukr = 'Перемістити вниз'"));
    СтруктураКнопок.Вставить("ПереместитьВверх",НСтр("Ukr = 'Перемістити вгору'"));
    СтруктураКнопок.Вставить("КопированиеИВыделение",НСтр("Ukr = 'Копіювання та видалення'")); // Группа
    СтруктураКнопок.Вставить("КопироватьВБуферОбмена",НСтр("Ukr = 'Копіювати в буфер обімну'"));

    Для Каждого Кнопка Из СтруктураКнопок Цикл
        ЛокализацияЗаголовка(Форма.Элементы, ТабличнаяЧасть.Имя+"КонтекстноеМеню"+Кнопка.Ключ, Кнопка.Значение);
    КонецЦикла;

КонецПроцедуры

&НаСервере
Процедура ЛокализацияЗаголовка(Элементы, ИмяЭлемента, Заголовок) Экспорт

    ТекущийЭлемент = Элементы.Найти(ИмяЭлемента);
    Если Не ТекущийЭлемент = Неопределено Тогда
        ТекущийЭлемент.Заголовок = Заголовок;
        Если ТипЗнч(Элементы.Найти(ИмяЭлемента)) = Тип("ГруппаФормы") Тогда
            ТекущийЭлемент.Подсказка = Заголовок;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

&НаСервере
Функция ПолучитьВидОбъектаМетаданных(Ссылка) Экспорт

    Перем ВидОбъектаМетаданных;

    ИмяОбъектаМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя;

    Если Не Метаданные.Документы.Найти(ИмяОбъектаМетаданных) = Неопределено Тогда
        ВидОбъектаМетаданных = "Документ";
    ИначеЕсли Не Метаданные.Справочники.Найти(ИмяОбъектаМетаданных) = Неопределено Тогда
        ВидОбъектаМетаданных = "Справочник";
    КонецЕсли;

    Возврат ВидОбъектаМетаданных;

КонецФункции

&НаСервере
Функция ЯзыкПриложения() Экспорт;

    ПользовательИнформационнойБазы = ПользователиИнформационнойБазы.ТекущийПользователь();

    Возврат ПользовательИнформационнойБазы.Язык;

КонецФункции

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

  1. 1xbet korean - Legalbet
    1xbet korean kadangpintar | งานออนไลน์ Find the best soccer betting markets. Choose from more than 200 different betting markets, like football, horse racing, cricket, 1xbet korean tennis,

    ОтветитьУдалить