Имя: Пароль:
1C
1С v8
Словарь интерфейса на разных языках
0 travelekb
 
25.02.20
10:57
Здравствуйте.

Имею необходимость в создании самописной конфигурации на разных языках. В зависимости от локализации все интерфейсные сообщения должны выводиться на том, или ином языке.
Подскажите, как можно оптимально реализовать данную возможность?
Я вижу это так:
* создаю Справочник "СловарьИнтерфейса"
* заполняю необходимыми выражениями
* в момент необходимости вывода сообщения пользователю, получаю запросом из Справочника нужную фразу в нужной локализации
* отображаю пользователю.

Для себя вижу большой минус в том, что каждый раз нужно делать, хоть и внеконтекстный, но серверный вызов (для получения фразы из Справочника).
При старте системы хотелось бы единоразово загрузить в память словарь фраз в нужной локали, например, через Структуру, после чего получать необходимые фразы уже из нее, без обращения к серверу каждый раз.
Прошу помощи в том, как можно это реализовать в системе? Начинающий, поэтому заранее прошу прощения, за возможно простой вопрос.

Спасибо.
1 vicof
 
25.02.20
11:21
Добавить язык и указывать синонимы не?
2 travelekb
 
25.02.20
11:23
(1) я имел ввиду сообщения, которые выводятся программно, например, заголовок функции "ПоказатьВводСтроки"
3 pechkin
 
25.02.20
11:25
а прям в коде прописать, как 1с рекомендует?
4 travelekb
 
25.02.20
11:25
Сейчас реализовано так:

Заголовок = НСтр("ru = 'Введите номер:'; en = 'Enter number:'");
Оповещение = Новый ОписаниеОповещения("ПослеВводаТрекНомера", ЭтотОбъект, Параметры);
ПоказатьВводСтроки(Оповещение, , Заголовок);

т.е. сама фраза "зашита" в коде. Я хотел бы вынести это в отдельный словарь, с возможностью корректировки фраз в пользовательском режиме.
5 travelekb
 
25.02.20
11:26
(3) так сделано, но как же "гибкость" и "удобство"? 1С действительно так и рекомендует?
6 vicof
 
25.02.20
11:27
(5) Ну на русском языке же сообщения в словаре не хранятся.
7 pechkin
 
25.02.20
11:27
гибкость - есть тулза для редактирования текстов многоязычных и усе
8 vicof
 
25.02.20
11:30
+(6) Можешь, конечно, хранить. Но это дополнительный геморрой с идентификацией этих сообщений, усложнением вывода, добавлением запросов при выводе сообщений и доступом к справочнику. Оно надо?
9 lEvGl
 
гуру
25.02.20
11:31
что плохого в обращении к серверу, если это и так происходит на каждом шагу? ерунда какая то
10 travelekb
 
25.02.20
11:32
(6) а должны храниться, так же как и на всех остальных языках.
(7) действительно, для большинства элементов форм реализована возможность отображения на разных языках. Но я имею ввиду о самостоятельно-генерируемых сообщениях в коде, например, через банальное Сообщить();
11 VladZ
 
25.02.20
11:32
(4) "Я хотел бы вынести это в отдельный словарь, с возможностью корректировки фраз в пользовательском режиме." - не нужно в пользовательском. Кесарю - кесарево, а слесарю - слесарево!
12 vicof
 
25.02.20
11:33
(9) Чем меньше, тем лучше
13 vicof
 
25.02.20
11:33
(11) А пользователю использованное)
14 travelekb
 
25.02.20
11:33
(9) возможно Вы и правы, но вся имеющаяся учебная литература назойливо твердит о том, что настоятельно рекомендуется уменьшать количество вызовов сервера.
15 VladZ
 
25.02.20
11:41
Я бы делал так:
1. Тексты сообщений хранил бы в ТабличномДокументе в виде Код сообщения - Тест сообщения. Табличный документ для каждого языка свой.
2. Сообщения в табличном документе должны быть разделены по секциям: по видам документов, в которых они используются.  Если есть какие-то общие сообщения - выделить их в отдельную секцию.
3. При создании объекта на сервере получать все нужные тексты сообщений в ТаблицуЗначений (по секции документа + общие для всех).
4. При выводе получать сообщение по Коду сообщения из ТЗ п.3.

В итоге:
1. Все сообщения в одном месте.
2. Обращения к серверу минимальны.
16 travelekb
 
25.02.20
11:43
(15) Благодарю! Буду пробовать
17 pechkin
 
25.02.20
11:50
(15) а как ты табл документ будешь читать? или без сервера это без сервера БД.
тогда тут повторные значения спасают
18 VladZ
 
25.02.20
11:52
(17) НаСервереБезКонтекста, если я правильно понял вопрос.
19 pechkin
 
25.02.20
11:54
(18) ну и где ж тогда без вызова сервера?
20 pechkin
 
25.02.20
11:54
или при открытии формы читать все сообщения?
21 VladZ
 
25.02.20
11:56
(20) ПриСозданииНаСервере
22 080808Ник
 
25.02.20
11:58
(0) как вариант извращения. делаем обрабокту, которая выгружает тексты модулей в файлы. парсит их, формирует словарь. Правите как хотите, далее нажимаете - сохранить и все загружается в конфу.
23 travelekb
 
25.02.20
12:15
А никак не реализовать это через МодульСеанса или что-то подобное?

Я создаю Справочник "СловарьИнтерфейса", заполняю его значениями на разных языках.
Например,
             ru       en        de
wlc_msg   "Привет"  "Hello"  "Hallo"
end_msg   "Прощай"  "Bye"    "auf Wiedersehen"

Далее, в сеансе пользователя (его локаль уже будет известна), на Клиенте, например в структуру загружаются ключи и значения для нужной локали (например если пользователь работает в "en"):
{wlc_msg:"Hello"},{end_msg:"Bye"}

Если пользователь работает в локали "ru" - в структуре будут значения из соотвествующего реквизита ("ru") Справочника

В момент необходимости вывода информационного сообщения, я просто получаю из структуры значение по ключу.
24 pechkin
 
25.02.20
12:17
параметры сеанса тоже на сервере хранятся
25 travelekb
 
25.02.20
12:22
(24) понял, спасибо.
26 080808Ник
 
25.02.20
12:37
(23) вы представляете сколько в памяти придется держать строк текста?
27 travelekb
 
25.02.20
13:19
(26) а сколько? Ну будет там 3-5 десятка фраз. Не считаю что это так много.
28 novichok79
 
25.02.20
13:25
хранить где-нибудь в табличном документе, общем.
или в макете объекта метаданных.
при создании на сервере читать это дело в структуру, реквизит формы.
или вообще держать переменную типа соответствие в модуле формы, чтобы текст туда-сюда не гонять, а держать на клиенте.
ну как-то так при первом приближении.
29 unenu
 
25.02.20
14:03
для самых быстрых извращений(при условии, что ОП валом и диски большие) можно так

// Метод общего модуля повторного использования с установкой "На время сеанса"
Функция СтвЗаголовки()
    
    СтвЗаголовки = Новый Соответствие;
    СтвЗаголовки.Вставить("wlc_msg", Новый Структура("ru,en,de", "Привет", "Hello", "Hallo"));
    СтвЗаголовки.Вставить("end_msg", Новый Структура("ru,en,de", "Прощай", "Bye", "auf Wiedersehen"));
    //
    Возврат СтвЗаголовки;
    
КонецФункции

// Получение из памяти
wlc_msg_en = _ОбщийМодульПовтИсп.СтвЗаголовки().СтвЗаголовки.Получить("wlc_msg").en;
30 pechkin
 
25.02.20
14:42
(29) лучше отдельные стурктуры под разные языки.
так меньше памяти нужно.