Разработка мультиязычных мобильных приложений на платформе 1С:Предприятие имеет свои уникальные особенности, которые кардинально отличаются от работы обычного тонкого или толстого клиента. Часто разработчики сталкиваются с ситуацией: в конфигурации добавлены два языка (например, русский и английский), синонимы всех объектов корректно заполнены, для пользователя информационной базы программно или вручную установлен английский язык, но интерфейс приложения на мобильном устройстве упорно продолжает отображаться на русском. При этом функции проверки показывают, что текущим языком сеанса назначен английский.
В этой статье мы подробно разберем, почему возникает этот конфликт локализации, как работает жизненный цикл мобильного приложения 1С при взаимодействии с операционной системой (Android или iOS) и какими способами можно реализовать полноценное переключение языков.
В традиционной настольной версии 1С язык интерфейса жестко привязан к настройкам конкретного пользователя информационной базы. При старте сеанса платформа считывает параметры авторизовавшегося пользователя и динамически перестраивает графическую оболочку под его языковой код.
В мобильной платформе 1С логика инициализации работает совершенно иначе. Проанализируем ключевые причины несоответствия:
Для понимания сути проблемы важно четко разделять назначение системных функций платформы 1С. Разберем их различия подробнее:
Функция ТекущийЯзыкСистемы() возвращает код языка локализации самой операционной системы мобильного устройства (например, «ru» или «en»). На это значение разработчик никак не может повлиять программно из кода 1С — оно полностью контролируется настройками смартфона или планшета.
Функция ТекущийЯзык() возвращает объект метаданных типа Язык, установленный для текущего сеанса 1С. Именно из-за этого различия у автора темы возникала ситуация, когда код:
Язык = ТекущийЯзык();
ЗаголовокТекст = НСтр("ru = 'Уведомления('; en = 'Notifications('", Язык.КодЯзыка);
отрабатывал корректно и возвращал английский вариант строки, так как сеанс пользователя действительно имел статус «en». При этом все стандартные элементы форм, командная панель и синонимы объектов оставались на русском языке, поскольку графическая оболочка ориентировалась на ТекущийЯзыкСистемы().
Если вы изменили язык интерфейса в настройках самого телефона (например, перевели Android или iOS с русского на английский), вы можете обнаружить, что интерфейс мобильного приложения 1С всё равно остался прежним. Выясним причину этого поведения.
Современные мобильные операционные системы оптимизируют использование оперативной памяти. Когда вы сворачиваете приложение или переходите на главный экран, операционная система не закрывает программу, а переводит её в фоновый режим ожидания (суспенд). Мобильная платформа 1С кэширует языковые настройки системы ровно один раз — в момент первого холодного запуска.
Чтобы заставить мобильное приложение применить новые языковые настройки смартфона, необходимо выполнить следующие шаги:
Очевидно, что требовать от конечных пользователей менять язык всей операционной системы телефона ради одного приложения — это нежизнеспособный сценарий. Если перед вами стоит задача реализовать выбор языка внутри настроек самого приложения, стандартный механизм автоматических синонимов объектов использовать не получится. Рассмотрим проверенные архитектурные решения.
Этот метод основан на полном отказе от стандартных синонимов платформы в пользу программной перезаписи заголовков элементов при создании форм. Посмотрим на пример реализации данного алгоритма:
1. Создайте в конфигурации регистр сведений или макет в формате JSON, в котором будут храниться переводы для каждого элемента интерфейса. Структура данных может выглядеть следующим образом:
// Пример структуры JSON-макета локализации
{
"ru": {
"FormTitle": "Список уведомлений",
"ButtonSend": "Отправить",
"LabelStatus": "Статус операции"
},
"en": {
"FormTitle": "Notifications List",
"ButtonSend": "Send",
"LabelStatus": "Operation Status"
}
}
2. Внедрите в общие модули процедуру динамической локализации, которая будет вызываться в обработчике ПриСозданииНаСервере для каждой формы приложения:
Процедура ЛокализоватьФорму(Форма, КодЯзыка) Экспорт
// Получаем структуру перевода для конкретной формы и языка
СтруктураПеревода = ПолучитьДанныеПеревода(Форма.ИмяФормы, КодЯзыка);
Если СтруктураПеревода = Неопределено Тогда
Возврат;
КонецЕсли;
// Устанавливаем заголовок самой формы
Если СтруктураПеревода.Свойство("ЗаголовокФормы") Тогда
Форма.Заголовок = СтруктураПеревода.ЗаголовокФормы;
КонецЕсли;
// Обходим все визуальные элементы формы
Для Каждого Элемент Из Форма.Элементы Цикл
ИмяЭлемента = Элемент.Имя;
Если Не СтруктураПеревода.Свойство(ИмяЭлемента) Тогда
Продолжить;
КонецЕсли;
// В зависимости от типа элемента меняем нужные свойства
Если ТипЗнч(Элемент) = Тип("КнопкаФормы")
Или ТипЗнч(Элемент) = Тип("ПолеФормы")
Или ТипЗнч(Элемент) = Тип("ДекорацияФормы") Тогда
Элемент.Заголовок = СтруктураПеревода[ИмяЭлемента];
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При таком подходе вы храните выбранный пользователем язык во внутренней константе мобильного приложения и принудительно локализуете интерфейс независимо от системного языка устройства.
Если вам необходимо выводить программные предупреждения, сообщения пользователю или генерировать динамический текст, всегда явно передавайте вторым параметром код языка, сохраненный в пользовательских настройках приложения. Избегайте использования НСтр() в базовом виде без параметров на мобильной платформе.
Рассмотрим правильный шаблон вызова системных уведомлений:
// Переменная ВыбранныйКодЯзыка хранит значение "ru" или "en" из настроек приложения
ТекстСообщения = НСтр("ru = 'Успешно сохранено!'; en = 'Successfully saved!'", ВыбранныйКодЯзыка);
ПоказатьПредупреждение(, ТекстСообщения);
Иногда перевод на второй язык полностью пропадает из скомпилированного приложения, даже если язык телефона изменен. Проанализируем причину, скрытую в процессе сборки утилитой «Сборщик мобильных приложений»:
.apk для Android или .ipa для iOS) сборщик компилирует ресурсы локализации.1cema.xml внутри собранного пакета. В нем должны быть явно объявлены все поддерживаемые языки с корректными кодами (например, languageCode="ru" и languageCode="en"), как показано в исходном файле конфигурации. Если секция языка отсутствует в ресурсах сборки, операционная система мобильного устройства не сможет передать нужную локаль внутрь графической оболочки мобильной платформы 1С.