You've already forked pages
forked from didirus/AstralRinth
* draft: layout for alert * feat: simplify * feat: remove dummy data * fix: lint and widths * feat: use chips rather than dropdown select * feat: remove gap from admonition header v body * Revert "feat: remove gap from admonition header v body" This reverts commit 46cce52799bc3ac24825a73ca4add18e0acad3c1. * fix: niche fixes * feat: update for new backend structure * fix: i18n
3.4 KiB
3.4 KiB
applyTo
| applyTo |
|---|
| **/*.vue |
You are given a Nuxt/Vue single-file component (.vue). Your task is to convert every hard-coded natural-language string in the into our localization system using @vintl/vintl-nuxt (which wraps FormatJS).
Please follow these rules precisely:
- Identify translatable strings
- Scan the for all user-visible strings (inner text, alt attributes, placeholders, button labels, etc.). Do not extract dynamic expressions (like {{ user.name }}) or HTML tags. Only extract static human-readable text.
- Create message definitions
- In the <script setup> block, import
defineMessageordefineMessagesfrom@vintl/vintl. - For each extracted string, define a message with a unique
id(use a descriptive prefix based on the component path, e.g.auth.welcome.long-title) and adefaultMessageequal to the original English string. Example: const messages = defineMessages({ welcomeTitle: { id: 'auth.welcome.title', defaultMessage: 'Welcome' }, welcomeDescription: { id: 'auth.welcome.description', defaultMessage: 'You’re now part of the community…' }, })
- Handle variables and ICU formats
- Replace dynamic parts with ICU placeholders: "Hello, ${user.name}!" →
{name}and defaultMessage: 'Hello, {name}!' - For numbers/dates/times, use ICU/FormatJS options (e.g., currency):
{price, number, ::currency/USD} - For plurals/selects, use ICU:
'{count, plural, one {# message} other {# messages}}'
- Rich-text messages (links/markup)
- In
defaultMessage, wrap link/markup ranges with tags, e.g.: "By creating an account, you agree to our Terms and Privacy Policy." - Render rich-text messages with
<IntlFormatted>from@vintl/vintl/componentsand map tags viavalues: - For simple emphasis:
'Welcome to <strong>Modrinth</strong>!'and map'strong': (c) => <strong>{c}</strong>
- Formatting in templates
- Import and use
useVIntl(); preferformatMessagefor simple strings:const { formatMessage } = useVIntl()<button>{{ formatMessage(messages.welcomeTitle) }}</button> - Vue methods like
$formatMessage,$formatNumber,$formatDateare also available if needed.
- Naming conventions and id stability
- Make
ids descriptive and stable (e.g.,error.generic.default.title). Group related messages withdefineMessages.
- Avoid Vue/ICU delimiter collisions
- If an ICU placeholder would end right before
}}in a Vue template, insert a space so it becomes} }to avoid parsing issues.
- Update imports and remove literals
- Ensure imports for
defineMessage/defineMessages,useVIntl, and<IntlFormatted>are present. Replace all hard-coded strings withformatMessage(...)or<IntlFormatted>and remove the literals.
- Preserve functionality
- Do not change logic, layout, reactivity, or bindings—only refactor strings into i18n.
Use existing patterns from our codebase:
- Variables/plurals: see
apps/frontend/src/pages/frog.vue - Rich-text link tags: see
apps/frontend/src/pages/auth/welcome.vueandapps/frontend/src/error.vue
When you finish, there should be no hard-coded English strings left in the template—everything comes from
formatMessageor<IntlFormatted>.