Довідковий матеріал

Вимоги щодо локалізації конфігурації

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

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

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

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

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

Правильно:

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

Також слід звертати увагу на коректне використання функції НСтр.
Наприклад, неправильно:

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

правильно:

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

2. У разі якщо рядок є складеним і містить частини, що залежать від тих чи інших умов, проте наполегливо рекомендується використовувати логічно завершені, цілісні фрази. Для формування змінної складової рядка при цьому необхідно застосовувати заміну підрядків за певними правилами.

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

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

Правильно:

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

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

Примітка. У рідкісних випадках, коли підставлювані значення збігаються або містять підстановочні рядки (%Склад% тощо), описаний спосіб із застосуванням СтрЗаменить може працювати некоректно. У разі використання в конфігурації Библиотеки стандартных подсистем у розпорядженні розробника є спеціалізована функція СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку, у якій такого обмеження немає:

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

3. У функції НСтр рядок обмежується символами одинарних лапок. Така вимога зумовлена частим використанням подвійних лапок у рядкових літералах.
Неправильно:

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

Правильно:

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

4. Якщо все ж застосовується не заміна рядків у рядку-шаблоні, а додавання рядків, то немовні символи (пробіли, табуляція тощо) на початку та в кінці рядків необхідно виділяти в окремі рядкові літерали (які пропускаються під час перекладу).

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

ТекстСообщения = НСтр("ru = 'Остаток выданных подотчетному лицу денежных средств: '")
+ ВыборкаИзРезультатаЗапроса.ОстатокУПодотчетногоЛица;

Правильно:

ТекстСообщения = НСтр("ru = 'Остаток выданных подотчетному лицу денежных средств:'")
+ " " + ВыборкаИзРезультатаЗапроса.ОстатокУПодотчетногоЛица;

5. У рідкісних випадках рядкові літерали з текстів запитів також можуть виявитися частиною інтерфейсу користувача. У таких випадках рядкові літерали необхідно виносити з тексту запиту в параметри.
Неправильно:

ЗапросПоВерсиям = Новый Запрос(" 
|ВЫБРАТЬ 
|Версии.Ссылка, 
|ВЫБОР КОГДА Версии.Выпущена = ИСТИНА 
| ТОГДА ""(выпущена)"" 
| ИНАЧЕ ""(в разработке)"" 
|КОНЕЦ КАК ТекстПояснения 
| ИЗ 
| Справочник.Версии КАК Версии");

Правильно:

ЗапросПоВерсиям = Новый Запрос(" 
|ВЫБРАТЬ 
|Версии.Ссылка, 
|ВЫБОР КОГДА Версии.Выпущена = ИСТИНА 
| ТОГДА &ТекстВыпущеннойВерсии 
| ИНАЧЕ &ТекстНеВыпущеннойВерсии 
|КОНЕЦ КАК ТекстПояснения 
| ИЗ 
| Справочник.Версии КАК Версии"); 

ЗапросПоВерсиям.УстановитьПараметр("&ТекстВыпущеннойВерсии", НСтр("ru='(выпущена)'")); 
ЗапросПоВерсиям.УстановитьПараметр("&ТекстНеВыпущеннойВерсии", НСтр("ru='(в разработке)'"));

6. Під час використання функції Формат для виведення дат слід враховувати, що в різних країнах прийнято різний порядок розташування та роздільники для складових частин дати.
Наприклад, одна й та сама дата: 20.12.2012 – для Росії, 12/20/2012 – для США.

Тому замість явного задання формату дати

Формат(Дата, "ДФ=dd.MM.yyyy")

слід використовувати локальний формат дати:

Формат(Дата, "ДЛФ=D")

Інший некоректний приклад:

Формат(ДатаУтверждения, "ДФ='дд ММММ гггг'") + " г."

Правильно:

Формат(ДатаУтверждения, "ДЛФ=ДД")

7.1. Під час задання формату в полях введення у формах і полях звітів на базі СКД також слід використовувати локальні формати дати.

7.2. У полях форм зі списками вибору слід завжди встановлювати властивість РежимВыбораИзСписка у значення Истина. У цьому випадку в полі коректно виводитиметься локалізоване подання, а не значення зі списку вибору.

7.3. Під час перевизначення стандартних подань полів у звітах на базі СКД слід дотримуватися тих самих правил, що й у коді модулів. Наприклад, неправильно

"N " + ВОтветНаНомер + " от " + Формат(ВОтветНаДата, "ДФ=dd.MM.yyyy")

правильний вираз, за яким обчислюється подання поля:

СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'N%1 от %2'"),
ВОтветНаНомер,
Формат(ВОтветНаДата, "ДЛФ=D"))

Примітка: функція СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку доступна в разі використання в конфігурації Библиотеки стандартных подсистем.

8. Виняток із цього правила становлять окремі випадки.

8.1. Автогенеровані рядки, які програмно записуються до інформаційної бази та виводяться користувачам.
Наприклад, автогенерований коментар до проводки, параметр ИмяСобытия методу ЗаписьЖурналаРегистрации.

Для таких рядків слід передбачити локалізацію, але при цьому явно задавати для них основну мову конфігурації.
Інакше під час роботи з багатомовними конфігураціями, якщо документ провів користувач із російськомовним інтерфейсом, а потім той самий документ повторно провів користувач з англомовним інтерфейсом, то вміст записів регістру бухгалтерії стане іншим (що є помилковим).

Такі місця в коді рекомендується супроводжувати коментарем, що пояснює причину винятку з правила:

Комментарий = НСтр("ru = 'Комментарий к проводке'", Метаданные.ОсновнойЯзык.КодЯзыка); // рядок записується до ІБ

У разі використання в конфігурації Библиотеки стандартных подсистем для отримання коду основної мови слід використовувати функцію КодОсновногоЯзыка загального модуля ОбщегоНазначенияКлиентСервер.

8.2. Не локалізуються рядкові константи з внутрішніми ідентифікаторами, які не виводяться користувачам. До них не слід застосовувати функцію НСтр.
Наприклад:

Тип("Массив")
Возврат "ОперацияВыполненаУспешно";
Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка);
ОткрытьФорму("Справочник.НаборыДополнительныхРеквизитовИСведений.Форма.РедактированиеСоставаНаборов");

тощо.

8.3. Тексти запитів також не локалізуються.

Записатися телефоном