This example demonstrates basic message extraction and compilation using rules_formatjs.
.
├── BUILD.bazel # Bazel build configuration
├── MODULE.bazel # Bazel module configuration
├── src/
│ └── App.tsx # Example React component with i18n messages
└── messages/ # Generated message files (created by Bazel)
├── en.json # Extracted messages
└── en-compiled.json # Compiled messages
Extract messages from the source file:
bazel build //:extract_messagesThis will generate bazel-bin/messages/en.json with extracted messages.
Compile the extracted messages for production:
bazel build //:compile_messagesThis will generate bazel-bin/messages/en-compiled.json with optimized compiled messages.
bazel build //...-
Message Extraction: The
formatjs_extractrule scanssrc/App.tsxfor:<FormattedMessage>componentsintl.formatMessage()calls- Extracts the message ID, default message, and description
-
Message Compilation: The
formatjs_compilerule:- Takes the extracted JSON
- Compiles it to AST format for better runtime performance
- Outputs an optimized JSON file
-
Content-based IDs: Using
id_interpolation_pattern = "[sha512:contenthash:base64:6]"generates stable IDs based on message content, which helps with:- Automatic ID generation
- Detecting message changes
- Version control friendly IDs
To use the compiled messages in your React app:
import messages from './messages/en-compiled.json';
import { createIntl, createIntlCache, RawIntlProvider } from 'react-intl';
const cache = createIntlCache();
const intl = createIntl({ locale: 'en', messages }, cache);
<RawIntlProvider value={intl}>
<App />
</RawIntlProvider>