Переводчик конфигурации (диалоговые формы)

Попытки перевести типовую конфигурацию малой кровью. По возможности с сохранением поддержки.

Собственно получил задачу: перевести типовую УТ на КИТАЙСКИЙ (английский). Собственно — результат работы — то что получилось ниже. В файлах ничего выкладывать не буду — если кому интересно перевести конфу на английский — дочитает до конца.

Коротко — алгоритм такой: ПриОткрытии() — перебирать все реквизиты Формы и подставлять значения ПЕРЕВЕДЁННЫЕ.

Еще что стоит отметить — не пинайте сильно — таки первая публикация.

 

Итак: Общий модуль ПереводАнгл:

Функция УстановитьНадписиФормыАнгл(ДокументОбъект="", ФормаДокумента) Экспорт
Если ПараметрыСеанса.ТекущийПользователь.Язык =0 тогда // естественно флаг язык - в спр.пользователи
Возврат Истина
КонецЕсли;
Попытка
ФормаДокумента.Заголовок=ПереводАнгл.ПереводимЭлемент(ФормаДокумента.Заголовок);
Исключение
КонецПопытки;
Попытка
Для каждого элемент из ФормаДокумента.ЭлементыФормы цикл
Если СокрЛП(Элемент)="Надпись" тогда
Элемент.Заголовок=ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
Если СокрЛП(Элемент)="РамкаГруппы" тогда
Элемент.Заголовок=ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
Если СокрЛП(Элемент)="Кнопка" тогда
ЧтоПолучилось = Элемент.Заголовок;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
Элемент.Заголовок = ЧтоПолучилось;
КонецЕсли;
Если СокрЛП(Элемент)="КоманднаяПанель" тогда
Для Каждого Кнопка из Элемент.Кнопки Цикл
ЧтоПолучилось = Кнопка.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Кнопка.Текст);
Кнопка.Подсказка = ЧтоПолучилось;
Кнопка.Пояснение = ЧтоПолучилось;
Кнопка.Текст = ЧтоПолучилось;
Для Каждого Кнопа из Кнопка.Кнопки Цикл
ЧтоПолучилось = Кнопа.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(Кнопа.Текст);
Кнопа.Подсказка = ЧтоПолучилось;
Кнопа.Пояснение = ЧтоПолучилось;
Кнопа.Текст = ЧтоПолучилось;
КонецЦИкла;
КонецЦикла;
КонецЕсли;
Если СокрЛП(Элемент)="Панель" тогда
Для Каждого страница из Элемент.Страницы Цикл
страница.Заголовок = ПереводАнгл.ПереводимЭлемент(страница.Заголовок);
КонецЦикла;
ИначеЕсли СокрЛП(Элемент)="ТабличноеПоле" тогда
Для каждого колонка из Элемент.Колонки цикл
Колонка.ТекстШапки = ПереводАнгл.ПереводимЭлемент(Колонка.ТекстШапки);
КонецЦикла;
ИначеЕсли СОкрЛП(Элемент)="Флажок" тогда
Элемент.Заголовок = ПереводАнгл.ПереводимЭлемент(Элемент.Заголовок);
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для Каждого КолонкаСправочника из ФормаДокумента.ЭлементыФормы.СправочникСписок.Колонки Цикл
КолонкаСправочника.ТекстШапки = ПереводАнгл.ПереводимЭлемент(КолонкаСправочника.ТекстШапки);
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для Каждого панель из ФормаДокумента.ЭлементыФормы.ПанельФормы.Страницы Цикл
панель.Заголовок = ПереводАнгл.ПереводимЭлемент(панель.Заголовок);
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого кнопка из ФормаДокумента.ЭлементыФормы.ДействияФормы.Кнопки Цикл
кнопка.Текст=ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
Если Лев(кнопка.Имя,8)="Действие" тогда
ЧтоПолучилось=кнопка.Текст;
ЧтоПолучилось = ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
кнопка.Текст=ЧтоПолучилось;
кнопка.Пояснение=ЧтоПолучилось;
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого кнопка из ФормаДокумента.ЭлементыФормы.ОсновныеДействияФормы.Кнопки Цикл
Если Лев(кнопка.Имя,8)="Действие" тогда
кнопка.Текст=ПереводАнгл.ПереводимЭлемент(кнопка.Текст);
КонецЕсли;
КонецЦикла;
Исключение
КонецПопытки;
Попытка
Для каждого колонка из ФормаДокумента.ЭлементыФормы.ДокументСписок.Колонки Цикл
Колонка.ТекстШапки = ПереводАнгл.ПереводимЭлемент(Колонка.ТекстШапки);
КонецЦИкла;
Исключение
КонецПопытки;
Возврат истина;
КонецФункции

//В СИСТЕМЕ ДОЛЖЕН БЫТЬ СПРАВОЧНИК ПЕРЕВОД, ГДЕ НАИМЕНОВАНИЕ - ЧТО НУЖНО ПЕРЕВЕСТИ,
//А СТРОКОВЫЙ РЕКВИЗИТ АнглПеревод В НЕМ - ПЕРЕВОД.
Функция ПереводимЭлемент(Объект) Экспорт
Результат = Объект;
Если Объект="" тогда
Иначе
ССылкаЗаголовка=(Справочники.Перевод.НайтиПоНаименованию(Лев(СОкрЛП(Объект),100))) ;
Если ССылкаЗаголовка = Справочники.Перевод.ПустаяСсылка() тогда
Если (ПараметрыСеанса.ТекущийПользователь.ВводитПеревод =1) и //ФЛАГ ЧТО ТЕКУЩИЙ ПОЛЬЗОВАТЕЛЬ - ПЕРЕВОДЧИК
((Число(КодСимвола(Объект))>100)) тогда//ПОПЫТКА ВЫКИНУТЬ АНГЛИЙСКИЕ НАДПИСИ (И СПЕЦСИМВОЛЫ)
//ДАБЫ ИХ НЕ ПЕРЕВОДИТЬ
Сообщить(СОкрЛП(Объект)); //ДЛЯ СПИСКА ЧТО НУЖНО ПЕРЕВОДИТЬ.
КонецЕсли;
Иначе
Результат = ССылкаЗаголовка.АнглПеревод;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции

//ПОПЫТКА ЧЕРЕЗ СПРАВОЧНИК ПЕРЕВОД - ПЕРЕВЕСТИ ИНТЕРАКТИВНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Функция АнглВопрос(перем1="",перем2="",перем3="",перем4="",перем5="",перем6="") Экспорт
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем3=""тогда
результат = Вопрос(перем1,перем2)
ИначеЕсли перем4 = "" тогда
результат = Вопрос(перем1,перем2,перем3);
ИначеЕсли перем5 = "" тогда
результат = Вопрос(перем1,перем2,перем3,перем4);
ИначеЕсли перем6 = "" тогда
результат = Вопрос(перем1,перем2,перем3,перем4,перем5);
Иначе
результат = Вопрос(перем1,перем2,перем3,перем4,перем5,перем6);
КонецЕсли;
Иначе
ТекстВОпроса=ПереводАнгл.ПереводимЭлемент(перем1);
Если перем3="" тогда
результат = Вопрос(ТекстВОпроса,перем2)
ИначеЕсли перем4 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3);
ИначеЕсли перем5 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4);
ИначеЕсли перем6 = "" тогда
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4,перем5);
Иначе
результат = Вопрос(ТекстВОпроса,перем2,перем3,перем4,перем5,перем6);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции

Функция АнглСообщить(перем1="",перем2="") Экспорт  результат="";
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем2="" тогда
Сообщить(Перем1);
Иначе
Сообщить(Перем1,Перем2);
КонецЕсли;
Иначе
ТекстСообщения=ПереводАнгл.ПереводимЭлемент(Перем1);
Если перем2=""тогда
Сообщить(ТекстСообщения);
Иначе
Сообщить(ТекстСообщения,Перем2);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции

Функция АнглПредупреждение(перем1="",перем2="",перем3="") Экспорт
результат="";
Если ПараметрыСеанса.ТекущийПользователь.Язык = 0 тогда
Если перем2=""тогда
Предупреждение(Перем1);
ИначеЕсли перем3="" тогда
Предупреждение(Перем1,Перем2);
Иначе
Предупреждение(Перем1,Перем2,Перем3);
КонецЕсли;
Иначе
ТекстСообщения=ПереводАнгл.ПереводимЭлемент(Перем1);
Если перем2="" тогда
Предупреждение(ТекстСообщения);
ИначеЕсли перем3="" тогда
Предупреждение(ТекстСообщения,Перем2);
Иначе
Предупреждение(ТекстСообщения,Перем2,Перем3);
КонецЕсли;
КонецЕсли;
ВОзврат результат;
КонецФункции

 

И собственно самое интересное:

ДЛЯ ПЕРЕВОДА ФОРМЫ (ЛЮБОЙ): 

В ПриОткрытии() необходимых для перевода форм дописать:

ПереводАнгл.УстановитьНадписиФормыАнгл(, ЭтаФорма);

ДЛЯ ПЕРЕВОДА СООБЩЕНИЙ, ПРЕДУПРЕЖДЕНИЙ, ВОПРОСОВ:

НУЖНО ПО КОНФИГУРАЦИИ СДЕЛАТЬ ГЛОБАЛЬНУЮ ЗАМЕНУ:

Сообщить(»    на    ПереводАнгл.АнглСообщить(«

Вопрос(»    на    ПереводАнгл.АнглВопрос(«

Предупреждение(»    на   ПереводАнгл.АнглПредупреждение(«

По факту в одной из конфигураций пришлось допилить функцию ЧтототамВОПРОС() по факту замены.

А далее — вручаем  ключи от перевода (флаги Язык и ВводитПеревод)- пользователю 1С и кратко инструктируем.

Собственно все.

Не нужно писать про ОбновлениеОтображения() — Действительно не вписывается в «перевести в конфигурацию за пол часа.» Вообще типовые это что-то.

 

Если кто дочитал до конца, и есть мысли по поводу — есть пара вопросов.

1. Хочу научить конфу не английскому, а китайскому. Подскажите что нить по вопросу кодировок. (хочу в диалоговую форму

вставить иероглиф).

2. Решить вопрос со связанной информацией (кнопочка перейти) — вообще подобным методом возможно?

 

 

9 Comments

  1. Serj1C

    Что-то подобное (с перебором элементов на форме) делал в своей http://infostart.ru/public/123258/

    Изначально тоже хотел перевести на болгарский, например, но потом решил остановиться на транслитерации.

    Reply
  2. Rad90210

    Как бы на модуль глянуть? можно на gala1442@gmail.com ?

    Вообще, хочу на базе идеи, сделать конечный продукт. Очень хочу китайский … Только блин кодировки…

    Reply
  3. www2000

    Можете использовать следующую бесплатную разукрашку

    Reply
  4. kostia.ck

    Да, идея неплохая, автору плюс.

    Хочется только чтобы выборка значений справочника перевода вызывалась один раз — перебор элементов формы проходит быстрее чем поиск нужного справочника.

    P.S. При большой загруженности сервера 1С (китайцев много) форма будет тупить при открытии что будет наводить тоску на конечных пользователей. Правильнее будет править синонимы на нужном языке. Отличный способ описывается в статье Редактирование текстов интерфейса … — быстро и обходится малой кровью. Переведутся все кроме стандартных текстов. Пример перевода стандартных текстов можно посмотреть в статье Локализация стандартных текстов интерфейсов.

    Reply
  5. AlexO

    Сергей Радченко — родственник Максима Радченко?

    Reply
  6. Rad90210

    (5) AlexO, Не. Однофамильцы.

    Reply
  7. babnik1990

    Добрый день! Нужна Ваша помощь, мне нужно перевести конфу Документооборот на английский, хотелось бы посоветоваться. Очень буду благодарен если свяжитесь со мной (babiy_m_v@mail.ru), нужна помощь.

    Reply
  8. Rad90210

    (4) kostia.ck, ***Хочется только чтобы выборка значений справочника перевода вызывалась один раз*** — как показывает практика — перевод нужен больше для того чтобы он БЫЛ. И теоретически пользователь англоязычный мог бы зайти и ВСЕ очень быстро ПРОВЕРИТЬ. На практике — если туда кто-то и заходит — то 1 раз в пол года, и то случайно. Приехать в другую страну, и там работать? Достаточно того, что теоретически возможность проверить работу местных сотрудников есть — этого оказалось достаточно.

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

    Как только станет вопрос в необходимости — этим без проблем займусь. Но судя по сказанному выше — вероятно это никому не нужно )).

    Кстати — для отчетов, основанных на УниверсальномОтчете — перевести заголовки — дело тоже 5 минут. Причем используя тот же алгоритм.

    А по надписям на кнопках, особенно програмно генерируемых — так у меня — вообще самый красивый вариант ))

    Reply
  9. Rad90210

    Ребят, есть реально кто-нить который в 1С вставлял иероглифы? Реально интересно : полетит — не полетит ?..

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *