#std761

Интерфейсные тексты в коде: требования по локализации

1.

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

Для этого используйте НСтр вместо прямых строковых литералов.

Неправильно

ПоказатьПредупреждение(, "Для выполнения операции необходимо установить расширение работы с файлами.");

Правильно

ПоказатьПредупреждение(, НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'"));

Также важно корректно использовать НСтр.

Неправильно

ТекстСообщения = "ru='Для выполнения операции необходимо установить расширение работы с файлами.'";
ПоказатьПредупреждение(, НСтр(ТекстСообщения));

Правильно

ТекстСообщения = НСтр("ru='Для выполнения операции необходимо установить расширение работы с файлами.'");
ПоказатьПредупреждение(, ТекстСообщения);
2.

Для составных строк, где части зависят от условий, используйте логически завершенные фразы и подстановку параметров через СтрШаблон.

Это нужно из-за разного порядка слов, знаков препинания и грамматики в разных языках.

Неправильно

СообщениеОНехватке = "Не хватает товара " + НаименованиеТовара + " на складе " + НаименованиеСклада + ".";

Правильно

ТекстСообщения = НСтр("ru = 'Не хватает товара %1 на складе %2.'");
СообщениеОНехватке = СтрШаблон(ТекстСообщения, НаименованиеТовара, НаименованиеСклада);

Не разрывайте одну фразу параметром действия (Включить, Копировать, Удалить и т.п.).

Неправильно

НСтр("ru = '%1 пользователя ""%2"" в группу ""%3""?'")

Правильно

НСтр("ru = 'Включить пользователя ""%2"" в группу ""%3""?'");
НСтр("ru = 'Копировать пользователя ""%2"" в группу ""%3""?'");
НСтр("ru = 'Удалить пользователя ""%2"" из группы ""%3""?'");

Допустимо:

  • формировать сообщение из нескольких предложений, если каждое предложение отдельно локализуется через НСтр;
  • использовать предложения с двоеточием (например, НСтр("ru = 'Создание каталога не выполнено по причине:'")).

Именованные параметры подстановки используйте только в вариантах [Параметр] и %Параметр%. Имя параметра должно соответствовать #std454: Правилам образования имен переменных.

Правильно

СообщениеОНехватке = НСтр("ru='Не хватает товара овар% на складе клад%.'");
СообщениеОНехватке = СтрЗаменить(СообщениеОНехватке, "овар%", НаименованиеТовара);
СообщениеОНехватке = СтрЗаменить(СообщениеОНехватке, "клад%", НаименованиеСклада);
3.

Если в конфигурации используется БСП, для составных форматированных строк вместо объекта ФорматированнаяСтрока применяйте функцию ФорматированнаяСтрока модулей СтроковыеФункции или СтроковыеФункцииКлиент.

Неправильно

Текст = Новый Массив;
Текст.Добавить(НСтр("ru = 'Перед удалением расширения рекомендуется'"));
Текст.Добавить(" ");
Текст.Добавить(Новый ФорматированнаяСтрока(НСтр("ru = 'выполнить резервное копирование информационной базы.'"), ШрифтыСтиля.ПолужирныйШрифт));
ТекстПредупреждения = Новый ФорматированнаяСтрока(Текст);

Правильно

ТекстПредупреждения = СтроковыеФункцииКлиент.ФорматированнаяСтрока(
    НСтр("ru = 'Перед удалением расширения рекомендуется <b>выполнить резервное копирование информационной базы</b>.'"));
4.

В НСтр строку ограничивайте одинарными кавычками.

Неправильно

ПоказатьПредупреждение(, НСтр("ru=Переменная типа ""Строка"""));
ПоказатьПредупреждение(, НСтр("ru=""Переменная типа ""Строка"""""));

Правильно

ПоказатьПредупреждение(, НСтр("ru='Переменная типа ""Строка""'"));
5.

Не выводите пользователю имена объектов метаданных и внутренние идентификаторы из кода.

Выводите синонимы (представления), и по возможности получайте их напрямую из метаданных через Представление.

Неправильно

СообщениеОшибка = НСтр("ru='Обнаружены отрицательные остатки по регистру ТоварыОрганизаций.'");

Правильно

СообщениеОшибка = СтрШаблон(
    НСтр("ru = 'Обнаружены отрицательные остатки по регистру ""%1"".'"),
    Метаданные.РегистрыНакопления.ТоварыОрганизаций.Представление());

Сокращенный вариант тоже допустим:

СообщениеОшибка = СтрШаблон(
    НСтр("ru = 'Обнаружены отрицательные остатки по регистру ""%1"".'"),
    Метаданные.РегистрыНакопления.ТоварыОрганизаций);
5.1.

Исключение: сообщения для разработчиков и интерфейсы инструментов разработчика/внедренца.

Там допустимо выводить имена объектов и идентификаторы, но имена процедур и функций выводите в полном виде (с именем общего модуля или модуля менеджера).

Неправильно

СообщениеОшибка = НСтр("ru = 'Ошибка в функции ЕстьРоль модуля УправлениеДоступом.'");

Правильно

ИмяФункции = "УправлениеДоступом.ЕстьРоль";
СообщениеОшибка = СтрШаблон(НСтр("ru = 'Ошибка в функции %1.'"), ИмяФункции);

Правильно

ИмяФункции = "Документы.АвансовыйОтчет.АдаптированныйТекстЗапросаДвиженийПоРегистру";
СообщениеОшибка = СтрШаблон(
    НСтр("ru = 'Для исправления движений документа необходимо вызвать функцию %1.'"),
    ИмяФункции);

Для имен объектов метаданных предпочтительно использовать ПолноеИмя.

Неправильно

СообщениеОшибка = НСтр("ru='Подсистема некорректно встроена в регистр ТоварыОрганизаций.'");

Правильно

СообщениеОшибка = СтрШаблон(
    НСтр("ru = 'Подсистема некорректно встроена в регистр %1.'"),
    Метаданные.РегистрыНакопления.ТоварыОрганизаций.ПолноеИмя());
6.

При использовании функций ЧислоПрописью, ПредставлениеПериода, СтрокаСЧислом не указывайте параметр Л= (L=) в строке форматирования.

Неправильно

СуммаПрописью = ЧислоПрописью(2341.56, "Л = ru_RU; ДП = Истина", НСтр("ru='доллар,доллара,долларов,м,цент,цента,центов,м,2'"));

Правильно

СуммаПрописью = ЧислоПрописью(2341.56, "ДП = Истина", НСтр("ru='доллар,доллара,долларов,м,цент,цента,центов,м,2'"));
7.

Не вызывайте функцию ПолучитьСклоненияСтрокиПоЧислу, так как она предназначена только для русскоязычного интерфейса.

Используйте:

  • СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка;
  • РаботаСКурсамиВалют.СформироватьСуммуПрописью;
  • СтрокаСЧислом;
  • ЧислоПрописью.

Либо реализуйте собственные прикладные функции.

8.

В редких случаях (например, длинный лог действий пользователя) допустимо собирать сообщение конкатенацией, а не шаблоном.

Но неязыковые символы (обычно перевод строки) в начале/конце текста выделяйте в отдельные строковые литералы.

Неправильно

ТекстСообщения = НСтр("ru = 'Не удалось сохранить файл документа по причине:
  |'")
  + ИнформацияОбОшибке;

Правильно

ТекстСообщения = НСтр("ru = 'Не удалось сохранить файл документа по причине:'")
  + Символы.ПС + ИнформацияОбОшибке;

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

9.

При вызове ПоказатьВопрос с указанием кнопок в параметре Кнопки:

  • по возможности используйте системное перечисление КодВозвратаДиалога;
  • если в перечислении нет нужной кнопки, задавайте ее представление через НСтр.

Неправильно

Кнопки = Новый СписокЗначений;
Кнопки.Добавить("Отключить");
Кнопки.Добавить("Нет");
ПоказатьВопрос(..., Кнопки);

Правильно

Кнопки = Новый СписокЗначений;
Кнопки.Добавить("Отключить", НСтр("ru='Отключить'"));
Кнопки.Добавить(КодВозвратаДиалога.Нет);
ПоказатьВопрос(..., Кнопки);
См. также
Проверки

#acc:492 #acc:1297 #acc:1298 #acc:1299 #acc:1354 #acc:1355 #acc:1356 #acc:1357 #acc:1358 #acc:1359

Источник

https://its.1c.ru/db/v8std#content:761