Namespaces
Namespaces are a powerful feature in the i18next internationalization framework and Locize, allowing you to organize your translations into multiple files. This makes it easier to manage, scale, and optimize your localization projects — especially as your app grows.
Why use namespaces?
While small projects may work with a single translation file, larger projects benefit from splitting translations into multiple namespaces. Reasons include:
- Improved organization: Avoid losing track when you have hundreds of segments in one file
- Faster load times: Only load the translations needed for a specific page or feature
- Easier collaboration: Teams can work on different namespaces independently
We recommend creating multiple, smaller namespaces for better maintainability.
Semantic reasons
Group related segments together for clarity and reuse. For example:
- common.json: Reusable UI elements like button labels ('save', 'cancel')
- validation.json: All validation messages
- glossary.json: Consistent terminology across your app (sample usage)
Technical/editorial reasons
Namespaces help you avoid loading all translations upfront, reducing initial load and improving performance. Common strategies include:
- Namespace per view/page
- Namespace per application section or feature set (e.g., admin area)
- Namespace per module for lazy loading in single-page applications
Configuration and usage
Locize / i18next
You can configure i18next to use multiple namespaces and set a default namespace:
i18next.init({
ns: ['common', 'moduleA', 'moduleB'],
defaultNS: 'moduleA'
}, (err, t) => {
i18next.t('myKey'); // key in moduleA namespace (default)
i18next.t('myKey', { ns: 'common' }); // key in common namespace
i18next.t('common:myKey'); // key in common namespace
});
// Load additional namespaces after initialization
i18next.loadNamespaces('myNamespace', (err, t) => { /* ... */ });Advanced options include:
- Calling the
tfunction with multiple namespaces to look up a key - Setting fallback namespaces for missing keys
More details: Locize / i18next
react-i18next
With react-i18next, you can load and use specific namespaces in your components:
// Load a specific namespace
// the t function will be set to that namespace as default
const { t, i18n } = useTranslation('ns1');
t('key'); // looked up from namespace ns1
// Load multiple namespaces
const { t, i18n } = useTranslation(['ns1', 'ns2', 'ns3']);
t('key'); // looked up from ns1
t('key', { ns: 'ns2' }); // looked up from ns2More details: react-i18next
locizify
locizify.init({
namespace: 'myNamespace'
ns: ['common', 'myNamespace'] // -> add additional namespaces to load
});You can access a different namespace by setting the attribute i18next-options:
<div i18next-options='{"ns": "common"}'>
<p>different namespace common is used</p>
<p>all the way down</p>
</div>Optionally you can set locizify to create a namespace per location/route.
locizify.init({
namespaceFromPath: true
});more details: locizify