Skip to content

Стандарт 761: Строка не локализована. Возможно, она видна пользователю. #745

@marmyshev

Description

@marmyshev

Название проверки

Строка не локализована. Возможно, она видна пользователю.

Английское название проверки
??

Правило анализа кода/метаданных

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

Область применения: управляемое приложение, мобильное приложение,
обычное приложение.

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

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

Например, неправильно:

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

Правильно:

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

Также следует обращать внимание на корректное использование функции
НСтр.

Например, неправильно:

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

правильно:

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

2. В том случае если строка является составной и включает в себя части,
зависящие от тех или иных условий, тем не менее, настоятельно
рекомендуется использовать логически завершенные, целостные фразы. Для
формирования переменной составляющей строки при этом необходимо
применять функцию
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку для подстановки
параметров в строки сообщений пользователю.

Неправильно:

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

Правильно:

СтрокаВопроса = НСтр("ru = 'Видите ли вы корректно это сообщение: ""%1""?'");
СтрокаВопроса =  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                     СтрокаВопроса, ПолучитьТекстСообщения());

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

В связи со сложившейся практикой, допускается использовать именованные
параметры подстановки (параметры, включающие имя аналогично переменной,
а не номер) только в двух вариантах: [Параметр], %Параметр%. Здесь
Параметр должен удовлетворять требованиям стандарта Правила образования
имен переменных.

Правильно:

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

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

Правильно:

Шаблон = НСтр("ru = '[Организация]-[Контрагент] Счет №[Номер] от [Дата]'");
ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Организация,Контрагент,Номер,Дата,Ссылка");
Для Каждого Ссылка Из МассивОбъектов Цикл
    ИмяФайла = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]);
КонецЦикла;

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

Неправильно:

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

Правильно:

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

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

Неправильно:

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

Правильно:

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

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

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

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

Мета-информация (пожалуйста, заполните если знаете):

  • Номер стандарта: 761
  • Код проверки: ??my-check-id
  • Тип ошибки: ERROR SECURITY PERFORMANCE WARNING PORTABILITY LIBRARY_DEVELOPMENT_AND_USAGE CODE_STYLE UI_STYLE SPELLING
  • Критичность: BLOCKER CRITICAL MAJOR MINOR TRIVIAL
  • Код ошибки АПК: 1297

Параметры проверки

  • NA

Текст ошибки

Строка не локализована. Возможно, она видна пользователю.

Пример некорректного решения

  • NA

Описание, почему так делать нельзя

Пример корректного решения

  • NA

Дополнительные материалы

Metadata

Metadata

Assignees

Labels

bsl1C Built-in Script LanguagestandardsПоддержка стандартовАПКДоработка совместимоси с функциональностю АПК ред.1

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions