Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
marmyshev opened this issue Sep 14, 2021 · 0 comments · May be fixed by #1062
Assignees
Labels
bsl 1C Built-in Script Language standards Поддержка стандартов АПК Доработка совместимоси с функциональностю АПК ред.1

Comments

@marmyshev
Copy link
Collaborator

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

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

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

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

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

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

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

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

@marmyshev marmyshev added bsl 1C Built-in Script Language dcs Data Composition Scheme (СКД) form Модель форм 1С mdo Metadata objects (Объекты метаданных) standards Поддержка стандартов АПК Доработка совместимоси с функциональностю АПК ред.1 Черновик Задача не отредактирована, шаблон, или не дописана. labels Sep 14, 2021
@marmyshev marmyshev self-assigned this Apr 2, 2022
@marmyshev marmyshev removed dcs Data Composition Scheme (СКД) mdo Metadata objects (Объекты метаданных) form Модель форм 1С Черновик Задача не отредактирована, шаблон, или не дописана. labels Apr 2, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bsl 1C Built-in Script Language standards Поддержка стандартов АПК Доработка совместимоси с функциональностю АПК ред.1
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant