Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Словарь интерфейса на разных языках

Словарь интерфейса на разных языках
Я
   travelekb
 
25.02.20 - 10:57
Здравствуйте.

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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.