i18n is Unbound’s localization layer. It loads string tables for the user’s active Discord locale and falls back to en-US.It gives you a Messages proxy and a format function for rendering those strings. Your addon shows text in the user’s language without any locale detection code of your own.
Use format for strings with placeholders. It resolves the key through Messages, then fills in your variables using ICU MessageFormat. Plurals, selects, and named slots all work.
import { i18n } from '@unbound-app/api';// string: "Deleted {count, plural, one {# message} other {# messages}}"i18n.format('MESSAGES_DELETED', { count: 3 }); // → "Deleted 3 messages"
defineLocalizations gives your addon its own Messages/format pair over a string table you provide. It shares the active locale with core, so your strings change language along with Discord. Your keys stay separate from core’s.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Unbound","colors":{"primary":"#c74050","light":"#c74050","dark":"#c74050"},"logo":{"light":"https://mintcdn.com/eternal/WYMTYR4nXSwGw7NX/logo/light.svg?fit=max\u0026auto=format\u0026n=WYMTYR4nXSwGw7NX\u0026q=85\u0026s=440b92dafc3e9b2bcca7696084a930ad","dark":"https://mintcdn.com/eternal/WYMTYR4nXSwGw7NX/logo/dark.svg?fit=max\u0026auto=format\u0026n=WYMTYR4nXSwGw7NX\u0026q=85\u0026s=fc16fd5f3d396b11a61067772bcce535"},"favicon":"https://mintcdn.com/eternal/WYMTYR4nXSwGw7NX/logo/dark.svg?fit=max\u0026auto=format\u0026n=WYMTYR4nXSwGw7NX\u0026q=85\u0026s=fc16fd5f3d396b11a61067772bcce535","api":{"mdx":{"auth":{"method":"bearer"}}},"appearance":{"default":"dark","strict":true},"background":{"decoration":"grid","color":{"light":"#fcfcfc","dark":"#0c0c0c"}},"footer":{"socials":{"x":"https://twitter.com/UnboundClient","github":"https://github.com/unbound-app","discord":"https://discord.gg/unbound"}},"search":{"prompt":"Search documentation..."},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Discord Community","icon":"discord","href":"https://discord.gg/unbound"},{"anchor":"GitHub","icon":"github","href":"https://github.com/unbound-app"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"eternal","hasAudioNarration":false,"actualSubdomain":"eternal","customDomains":["docs.unbound.rip"],"gitSource":{"type":"github","owner":"marioparaschiv","repo":"unbound","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4f6d4cb9ad1a9b1c3e3e9","collectionId":"99320731-f461-4c55-bc68-b1629ba5de3f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4f6d4cb9ad1a9b1c3e3e9"},"feedback":{"edits":true,"issues":true},"entitlements":{},"buildId":"6ae4f6d4cb9ad1a9b1c3e3e9","clientVersion":"0.0.4039","searchFilterCounts":[{"language":"default","tag":"Developer Guide","count":32},{"language":"default","tag":"API Reference","count":14},{"language":"default","tag":"User Guide","count":12},{"language":"default","tag":"Using Unbound","count":6},{"language":"default","tag":"Loader","count":5},{"language":"default","tag":"Interface","count":4},{"language":"default","tag":"Get Started","count":4},{"language":"default","tag":"Addons","count":3},{"language":"default","tag":"Development","count":3},{"language":"default","tag":"Data \u0026 Files","count":3}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"modules/i18n","slug":"/modules/i18n","pageMetadata":{"title":"i18n","description":"Localize your addon so it renders in the user's Discord language.","icon":"globe","href":"/modules/i18n"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Localize your addon so it renders in the user’s Discord language.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`3`,id:`what-is-i18n`,children:`What is i18n?`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`i18n`}),` is Unbound’s localization layer. It loads string tables for the user’s active Discord locale and falls back to `,_jsx(_components.code,{children:`en-US`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`It gives you a `,_jsx(_components.code,{children:`Messages`}),` proxy and a `,_jsx(_components.code,{children:`format`}),` function for rendering those strings. Your addon shows text in the user’s language without any locale detection code of your own.`]}),`\n`,_jsx(Heading,{level:`3`,id:`the-messages-proxy`,children:`The Messages proxy`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Messages`}),` is a proxy over the loaded string tables. When you read a key, it checks three places in order:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`active locale`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`en-US`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`key itself`}),`, so a missing translation shows something readable instead of `,_jsx(_components.code,{children:`undefined`}),`.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@unbound-app/api'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Messages`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`SETTINGS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// → \"Settings\" in the user's language`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`formatting`,children:`Formatting`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.code,{children:`format`}),` for strings with placeholders. It resolves the key through `,_jsx(_components.code,{children:`Messages`}),`, then fills in your variables using `,_jsx(_components.a,{href:`https://formatjs.io/docs/core-concepts/icu-syntax/`,children:`ICU MessageFormat`}),`. Plurals, selects, and named slots all work.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@unbound-app/api'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// string: \"Deleted {count, plural, one {# message} other {# messages}}\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`format`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'MESSAGES_DELETED'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`count:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 3`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// → \"Deleted 3 messages\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`addon-localizations`,children:`Addon localizations`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`defineLocalizations`}),` gives your addon its own `,_jsx(_components.code,{children:`Messages`}),`/`,_jsx(_components.code,{children:`format`}),` pair over a string table you provide. It shares the active locale with core, so your strings change language along with Discord. Your keys stay separate from core’s.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '@unbound-app/api'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`Messages`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`format`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` i18n`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`defineLocalizations`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\t'en-US'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`GREETING:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Hello, {name}!'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\t'fr'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`GREETING:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Bonjour, {name} !'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`format`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'GREETING'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`name:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'Mario'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})]}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Always include an `,_jsx(_components.code,{children:`en-US`}),` table. Every other locale falls back to it when a key is missing.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"i18n","description":"Localize your addon so it renders in the user's Discord language.","icon":"globe","href":"/modules/i18n"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What is i18n?","slug":"what-is-i18n","depth":3,"children":[]},{"title":"The Messages proxy","slug":"the-messages-proxy","depth":3,"children":[]},{"title":"Formatting","slug":"formatting","depth":3,"children":[]},{"title":"Addon localizations","slug":"addon-localizations","depth":3,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"eternal","siteName":"Unbound","title":"i18n - Unbound","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-13T10:06:22.128Z","originalFileLocation":"modules/i18n.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"dark\";if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Localize your addon so it renders in the user\u0026#x27;s Discord language.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Unbound\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"i18n - Unbound\">\u003cmeta data-mint-head property=\"og:description\" content=\"Localize your addon so it renders in the user\u0026#x27;s Discord language.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Unbound\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.unbound.rip/modules/i18n\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://eternal.mintlify.app/_mintlify/api/og/v2?division=Interface\u0026amp;title=i18n\u0026amp;description=Localize+your+addon+so+it+renders+in+the+user%27s+Discord+language.\u0026amp;theme=9162ba9ad2dc7f2247c4722a\u0026amp;signature=df1435360cb2d11a2ea6b53a2833a5f140db16f4b12b41e802075695c4cb4afb\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"i18n - Unbound\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Localize your addon so it renders in the user\u0026#x27;s Discord language.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://eternal.mintlify.app/_mintlify/api/og/v2?division=Interface\u0026amp;title=i18n\u0026amp;description=Localize+your+addon+so+it+renders+in+the+user%27s+Discord+language.\u0026amp;theme=9162ba9ad2dc7f2247c4722a\u0026amp;signature=df1435360cb2d11a2ea6b53a2833a5f140db16f4b12b41e802075695c4cb4afb\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/eternal/epz85gcrxS6sZ5iq/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Unbound\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c74050\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.unbound.rip/modules/i18n\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/modules/i18n.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.unbound.rip/#organization\",\"name\":\"Unbound\",\"url\":\"https://docs.unbound.rip\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/eternal/WYMTYR4nXSwGw7NX/logo/light.svg?fit=max\u0026auto=format\u0026n=WYMTYR4nXSwGw7NX\u0026q=85\u0026s=440b92dafc3e9b2bcca7696084a930ad\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.unbound.rip#website\",\"name\":\"Unbound\",\"url\":\"https://docs.unbound.rip\",\"publisher\":{\"@id\":\"https://docs.unbound.rip/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.unbound.rip/modules/i18n#webpage\",\"url\":\"https://docs.unbound.rip/modules/i18n\",\"name\":\"i18n\",\"description\":\"Localize your addon so it renders in the user's Discord language.\",\"dateModified\":\"2026-10-13T10:06:22.128Z\",\"isPartOf\":{\"@id\":\"https://docs.unbound.rip#website\"},\"breadcrumb\":{\"@id\":\"https://docs.unbound.rip/modules/i18n#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.unbound.rip/modules/i18n#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.unbound.rip/modules/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Interface\",\"item\":\"https://docs.unbound.rip/modules/settings\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"i18n\",\"item\":\"https://docs.unbound.rip/modules/i18n\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.unbound.rip/modules/i18n#article\",\"headline\":\"i18n\",\"name\":\"i18n\",\"description\":\"Localize your addon so it renders in the user's Discord language.\",\"url\":\"https://docs.unbound.rip/modules/i18n\",\"mainEntityOfPage\":{\"@id\":\"https://docs.unbound.rip/modules/i18n#webpage\"},\"dateModified\":\"2026-10-13T10:06:22.128Z\",\"publisher\":{\"@id\":\"https://docs.unbound.rip/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.unbound.rip#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Unbound\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Unbound","nav":{"global":{"anchors":[{"anchor":"Discord Community","icon":"discord","href":"https://discord.gg/unbound"},{"anchor":"GitHub","icon":"github","href":"https://github.com/unbound-app"}]},"tabs":[{"tab":"User Guide","icon":"user","pages":[{"title":"User Guide","href":"/overview"}]},{"tab":"Developer Guide","icon":"code","groups":[{"group":"Addons","icon":"puzzle-piece","pages":[{"title":"Introduction","icon":"puzzle-piece","href":"/addons/introduction"},{"title":"Creating an Addon","icon":"wand-magic-sparkles","href":"/addons/creating"},{"title":"The Manifest","icon":"circle-info","href":"/addons/manifest"}]},{"group":"Plugins","icon":"plug","pages":[{"title":"Introduction","icon":"plug","href":"/plugins/introduction"},{"title":"Patching Components","icon":"react","href":"/plugins/react-patching"},{"title":"Flux Stores","icon":"box","href":"/plugins/flux"}]},{"group":"Themes","icon":"paintbrush","pages":[{"title":"Introduction","icon":"paintbrush","href":"/themes/introduction"},{"title":"Theme Types","icon":"palette","href":"/themes/types"},{"title":"Backgrounds","icon":"image","href":"/themes/backgrounds"}]},{"group":"Icon Packs","icon":"icons","pages":[{"title":"Introduction","icon":"icons","href":"/icon-packs/introduction"}]},{"group":"Development","icon":"code","pages":[{"title":"Debugging","icon":"bug","href":"/development/debugging"},{"title":"CLI","icon":"terminal","href":"/development/cli"},{"title":"Local Builds","icon":"network-wired","href":"/development/local-builds"}]},{"group":"API Reference","icon":"folder-tree","pages":[{"title":"Introduction","icon":"folder-tree","href":"/modules/introduction"},{"group":"Modifying Discord","icon":"discord","pages":[{"title":"Metro","icon":"box-taped","href":"/modules/metro"},{"title":"Components","icon":"code","href":"/modules/components"},{"title":"Patcher","icon":"object-subtract","href":"/modules/patcher"}]},{"group":"Data \u0026 Files","icon":"hard-drive","pages":[{"title":"Storage","icon":"database","href":"/modules/storage"},{"title":"File System","icon":"folder","href":"/modules/fs"},{"title":"Assets","icon":"face-smile","href":"/modules/assets"}]},{"group":"Interface","icon":"window-maximize","pages":[{"title":"Settings","icon":"sliders","href":"/modules/settings"},{"title":"Toasts","icon":"bells","href":"/modules/toasts"},{"title":"Commands","description":"Add slash commands to Discord's chat input, with typed options, autocomplete and subcommands.","icon":"square-terminal","href":"/modules/commands"},{"title":"i18n","icon":"globe","href":"/modules/i18n"}]},{"group":"Runtime","icon":"microchip","pages":[{"title":"Managers","description":"How plugins and themes are loaded, started, and persisted across launches.","icon":"layer-group","href":"/modules/managers"},{"title":"Native","icon":"file-code","href":"/modules/native"},{"title":"Utilities","icon":"wrench","href":"/modules/utilities"}]}]},{"group":"Loader","icon":"arrow-right-to-bracket","pages":[{"title":"Introduction","icon":"loader","href":"/loader/introduction"},{"title":"iOS","icon":"apple","href":"/loader/ios"},{"title":"Android","icon":"android","href":"/loader/android"},{"title":"Configuration","icon":"gear","href":"/loader/configuration"},{"title":"Settings Reference","icon":"sliders","href":"/loader/settings"}]}]}]},"basePath":"","title":"i18n - Unbound","buildId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","deploymentId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","dynamics":[],"chunks":[]}