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

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

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

В наличии

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

Категория:

Описание

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

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

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

 

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

Функция УстановитьНадписиФормыАнгл(ДокументОбъект="", ФормаДокумента) Экспорт 	
	Если ПараметрыСеанса.ТекущийПользователь.Язык =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. Решить вопрос со связанной информацией (кнопочка перейти) — вообще подобным методом возможно?

 

 

has been added to your cart:
Оформление заказа