В экосистеме JavaScript, где одновременно сосуществуют шаблоны локализации, ICU-сообщения и динамически генерируемые строки, поддержание единообразного стиля кода становится критически важным. Prettier выступает инструментом автоматического форматирования, устраняющим споры о стиле и снижая когнитивную нагрузку при работе с интернационализацией через FormatJS.
FormatJS активно используется для работы с сообщениями на основе ICU MessageFormat, а также для построения многоязычных интерфейсов. Такие сообщения часто содержат вложенные конструкции, множественные параметры и условные выражения, что делает ручное форматирование нестабильным и подверженным ошибкам.
Prettier не интерпретирует логику сообщений FormatJS, но корректно форматирует JavaScript/TypeScript-код, внутри которого они находятся, обеспечивая предсказуемую структуру файлов и унифицированное представление строковых шаблонов.
ICU-сообщения, используемые в FormatJS, могут быть вложенными и достаточно сложными:
const messages = {
greeting: "Hello, {name}!",
inbox: "You have {count, plural, one {# message} other {# messages}}"
};
При росте сложности такие конструкции становятся трудночитаемыми:
const messages = {
notification:
"You have {count, plural, one {# new notification} other {# new notifications}} in your inbox"
};
Prettier автоматически приводит подобные конструкции к единообразному виду, разбивая строки по длине и выравнивая отступы в JavaScript-структурах.
Базовая настройка Prettier в проектах, использующих FormatJS, обычно минимальна, поскольку библиотека не требует специальных плагинов для форматирования кода. Основное внимание уделяется согласованию с ESLint и TypeScript.
{
"printWidth": 80,
"singleQuote": true,
"semi": true,
"trailingComma": "es5",
"tabWidth": 2
}
В проектах FormatJS часто используются JSON-файлы локализации:
{
"welcome": "Welcome, {name}",
"cart.items": "You have {count, number} items in your cart",
"errors.network": "Network error occurred"
}
Prettier обеспечивает:
Даже при увеличении количества ключей до тысяч строк структура остаётся консистентной.
FormatJS использует ICU-синтаксис, который может включать условия, числа и даты:
const message =
"You have {count, plural, " +
"one {# unread message} " +
"other {# unread messages}" +
"}";
После применения Prettier код приобретает более линейную структуру:
const message =
"You have {count, plural, " +
"one {# unread message} " +
"other {# unread messages}" +
"}";
Хотя Prettier не изменяет содержимое строки, он влияет на внешний код вокруг ICU-выражений, улучшая читаемость при длинных цепочках конкатенации или шаблонных литералах.
При использовании intl-messageformat часто применяются
шаблонные строки:
const msg = new IntlMessageFormat(
'Hello {name}, you have {count, number} messages',
'en'
);
Prettier оптимизирует расположение аргументов:
const msg = new IntlMessageFormat(
'Hello {name}, you have {count, number} messages',
'en'
);
В более сложных случаях с длинными сообщениями происходит разбиение аргументов по строкам:
const msg = new IntlMessageFormat(
'Hello {name}, your balance is {balance, number, currency}',
'en'
);
В типичной архитектуре локализации Prettier и ESLint работают совместно:
{
"extends": ["eslint:recommended", "plugin:react/recommended"],
"plugins": ["formatjs"],
"rules": {
"formatjs/no-missing-translation": "error",
"formatjs/enforce-placeholders": "warn"
}
}
Prettier устраняет необходимость ручного форматирования, позволяя ESLint сосредоточиться на проверке структуры сообщений.
FormatJS часто используется в React через
react-intl.
import { FormattedMessage } from 'react-intl';
function Header() {
return (
<FormattedMessage
id="header.title"
defaultMessage="Welcome, {name}"
values={{ name: 'User' }}
/>
);
}
Prettier стандартизирует JSX-структуру:
При увеличении количества параметров формат остаётся стабильным:
<FormattedMessage
id="dashboard.notifications"
defaultMessage="You have {count} notifications"
values={{ count }}
/>
ICU-выражения внутри defaultMessage могут становиться
длинными:
<FormattedMessage
id="cart.summary"
defaultMessage="You have {count, plural, one {# item} other {# items}} in cart"
/>
Prettier обеспечивает корректное разбиение JSX-элемента:
В TypeScript-проектах FormatJS часто используется строгая типизация сообщений:
import { defineMessages } from 'react-intl';
const messages = defineMessages({
title: {
id: 'page.title',
defaultMessage: 'Dashboard'
},
description: {
id: 'page.description',
defaultMessage: 'Overview of your activity'
}
});
Prettier обеспечивает:
При росте количества параметров ICU-сообщения становятся громоздкими:
const message =
'You have {count, plural, one {# message in your inbox} other {# messages in your inbox}}';
Prettier не изменяет логику строки, но обеспечивает корректное форматирование внешней структуры:
В больших системах локализации JSON-файлы могут содержать тысячи ключей:
{
"auth.login.title": "Login",
"auth.login.error": "Invalid credentials",
"auth.logout.success": "Successfully logged out"
}
Prettier обеспечивает:
Несмотря на широкие возможности форматирования, Prettier не влияет на:
Его задача ограничивается исключительно визуальной консистентностью JavaScript-кода и JSON-структур.
Сложные ошибки локализации остаются в зоне ответственности FormatJS и инструментов линтинга, а не форматирования.
При редактировании файлов локализации Prettier минимизирует шум в diff:
Это особенно важно при работе с командной разработкой и частыми обновлениями переводов, где конфликты в JSON-файлах возникают регулярно.
В монорепозиториях с несколькими приложениями и библиотеками FormatJS Prettier часто применяется централизованно:
.prettierrcЭто снижает расхождения между frontend, backend и пакетами локализации, особенно при использовании общих словарей сообщений.
Prettier обычно интегрируется в pipeline:
В связке с FormatJS это предотвращает попадание неформатированных ICU-сообщений и JSON-локализаций в production-код.