ADR-UI-015. Локализация и форматы

ADR Версия: 1.0 accepted

Целевая аудитория — российские библиотеки; весь интерфейс русский. Фиксируем: русский — единственный язык (без i18n-инфраструктуры), единые форматы дат/времени/чисел по локали ru и единую точку форматирования — встроенные пайпы Angular и общий пайп даты, без ручного форматирования в компонентах.

⟨/⟩ Исходник

1. Контекст и постановка задачи

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

Нужно зафиксировать два решения, чтобы они не выбирались заново в каждой задаче:

  1. Уровень локализации — заводим ли мы i18n-инфраструктуру (словари переводов, @angular/localize) или обходимся одним языком напрямую.
  2. Единая точка форматирования — где и как форматируются даты и числа, чтобы вид был одинаков во всём приложении, а компоненты не форматировали значения «руками».

Повод — вывод значения-даты (ISO yyyy-mm-dd) в человеко-читаемом виде.

2. Драйверы решения

  1. Соответствие спеке — вся спецификация и все интерфейсные тексты на русском.
  2. Минимум абстракций — не тащить словари переводов и @angular/localize под единственный язык.
  3. Единообразие форматов — даты, время, числа выглядят одинаково на всех экранах.
  4. Одна точка форматирования — никаких локальных форматтеров, разъезжающихся по компонентам.

3. Рассмотренные варианты

4. Решение

Выбран Вариант A. Все строки UI — прямо на русском в шаблонах и коде, без i18n-обёрток и словарей. Мультиязычности нет.

4.1. Регистрация локали (app.config.ts)

Локаль ru регистрируется один раз и задаётся как LOCALE_ID — на неё опираются встроенные пайпы (date, number, currency) и наши форматтеры:

import { registerLocaleData } from '@angular/common';
import localeRu from '@angular/common/locales/ru';
import { LOCALE_ID } from '@angular/core';

registerLocaleData(localeRu);

providers: [
  { provide: LOCALE_ID, useValue: 'ru' },
  // ...
]

4.2. Фиксируемые форматы

Аспект Значение
Язык интерфейса Русский (ru).
Формат даты дд.мм.гггг (dd.MM.yyyy).
Формат даты-времени дд.мм.гггг чч:мм (dd.MM.yyyy HH:mm).
Десятичный разделитель запятая.
Разделитель тысяч неразрывный пробел.
Первый день недели понедельник.
Часовой пояс локальный, пользовательский.
Валюта по умолчанию RUB (если появится вывод сумм).

4.3. Единая точка форматирования

  1. Числа, суммы, «широкие» даты — встроенные пайпы Angular (number, currency, date), работающие по LOCALE_ID = 'ru'.
  2. Доменные значения-даты приходят и хранятся как ISO-строка yyyy-mm-dd (машинный формат обмена с API). Для их показа — общий пайп icdDate (ui/pipes): режимы date / datetime, локаль ru. Пайп разбирает ISO-дату как локальную (полночь по месту), чтобы дата не «съезжала» на день при отрицательном смещении пояса.
  3. Собственные компоненты набора (icd-date-picker и др.) форматируют вывод и подписи календаря через Intl с локалью ru: понедельник — первый день недели, названия месяцев русские.
  4. Компоненты не форматируют даты/числа вручную (ни padStart-склейкой, ни локальными функциями) — только через пайпы/Intl-форматтеры выше.

4.4. Тексты и ошибки

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы