···3403405. If the language is `right-to-left`, add `dir: 'rtl'` (see `ar-EG` in config for example)
3413416. If the language requires special pluralization rules, add a `pluralRule` callback (see `ar-EG` or `ru-RU` in config for examples)
342342343343-Check [Pluralization rule callback](https://vue-i18n.intlify.dev/guide/essentials/pluralization.html#custom-pluralization) for more info.
343343+Check [Pluralization rule callback](https://vue-i18n.intlify.dev/guide/essentials/pluralization#custom-pluralization) and [Plural Rules](https://cldr.unicode.org/index/cldr-spec/plural-rules#TOC-Determining-Plural-Categories) for more info.
344344345345### Update translation
346346347347We track the current progress of translations with [Lunaria](https://lunaria.dev/) on this site: https://i18n.npmx.dev/
348348-If you see any outdated translations in your language, feel free to update the keys to match then English version.
348348+If you see any outdated translations in your language, feel free to update the keys to match the English version.
349349350350In order to make sure you have everything up-to-date, you can run:
351351···408408 <p>{{ $t('greeting', { name: userName }) }}</p>
409409 ```
410410411411+4. Don't concatenate string messages in the Vue templates, some languages can have different word order. Use placeholders instead.
412412+413413+ **Bad:**
414414+415415+ ```vue
416416+ <p>{{ $t('hello') }} {{ userName }}</p>
417417+ ```
418418+419419+ **Good:**
420420+421421+ ```vue
422422+ <p>{{ $t('greeting', { name: userName }) }}</p>
423423+ ```
424424+425425+ **Complex content:**
426426+427427+ If you need to include HTML or components inside the translation, use [`i18n-t`](https://vue-i18n.intlify.dev/guide/advanced/component.html) component. This is especially useful when the order of elements might change between languages.
428428+429429+ ```json
430430+ {
431431+ "agreement": "I accept the {terms} and {privacy}.",
432432+ "terms_link": "Terms of Service",
433433+ "privacy_policy": "Privacy Policy"
434434+ }
435435+ ```
436436+437437+ ```vue
438438+ <i18n-t keypath="agreement" tag="p">
439439+ <template #terms>
440440+ <NuxtLink to="/terms">{{ $t('terms_link') }}</NuxtLink>
441441+ </template>
442442+ <template #privacy>
443443+ <strong>{{ $t('privacy_policy') }}</strong>
444444+ </template>
445445+ </i18n-t>
446446+ ```
447447+411448### Translation key conventions
412449413450- Use dot notation for hierarchy: `section.subsection.key`
···415452- Group related keys together
416453- Use `common.*` for shared strings (loading, retry, close, etc.)
417454- Use component-specific prefixes: `package.card.*`, `settings.*`, `nav.*`
455455+- Do not use dashes (`-`) in translation keys; always use underscore (`_`): e.g., `privacy_policy` instead of `privacy-policy`
418456419457### Using i18n-ally (recommended)
420458