Skip to main content

Localization

Multinaire UI includes built-in internationalization (i18n) support using i18next and react-i18next.

Creating Translation Files​

Create JSON files for each language:

// assets/translations/en.json
{
"welcome": "Welcome",
"settings": "Settings",
"theme": "Theme",
"language": "Language",
"buttons": {
"submit": "Submit",
"cancel": "Cancel"
}
}
// assets/translations/es.json
{
"welcome": "Bienvenido",
"settings": "Configuración",
"theme": "Tema",
"language": "Idioma",
"buttons": {
"submit": "Enviar",
"cancel": "Cancelar"
}
}

Configure the Provider​

import MultinaireUI from '@multinaire/expo-ui';
import en from './assets/translations/en.json';
import es from './assets/translations/es.json';

const translations = {
en: { translation: en },
es: { translation: es },
};

export default function App() {
return (
<MultinaireUI translations={translations}>
{/* Your app */}
</MultinaireUI>
);
}

Using Translations​

Use the useLocalization hook for translations:

import { useLocalization } from '@multinaire/expo-ui';

function MyComponent() {
const { translate, language, changeLanguage } = useLocalization();

return (
<View>
<Text>{translate('welcome')}</Text>
<Text>{translate('buttons.submit')}</Text>

<Text>Current language: {language}</Text>

<Button
title="Switch to Spanish"
onPress={() => changeLanguage('es')}
/>
</View>
);
}

Interpolation​

Pass a second argument to translate to substitute variables into the translation string:

// en.json
{ "welcome": "Welcome to {{appName}}" }
translate('welcome', { appName: 'Multinaire UI' })
// → "Welcome to Multinaire UI"

The options object is typed as Record<string, unknown> and forwarded directly to i18next, so all standard i18next interpolation features (plurals, formatting, etc.) work out of the box.

Default Language​

Control the startup language with the defaultLanguage prop on MultinaireUI:

// Auto-detect: checks AsyncStorage first, then device locale, then first translation key (default)
<MultinaireUI translations={translations} defaultLanguage="auto">

// Hard-code a specific language (ignores stored preference)
<MultinaireUI translations={translations} defaultLanguage="fr">

Language Persistence​

When defaultLanguage is 'auto' (the default), the selected language is automatically persisted to AsyncStorage. When the app restarts, the user's language preference is restored.

Best Practices​

  1. Use nested keys for organization: screens.home.title, buttons.submit
  2. Keep translation files in sync across languages
  3. Use interpolation for dynamic values: translate('greeting', { name: 'John' })
  4. Provide fallback text for missing translations
  5. Use NotoSans as your UI font family when targeting multilingual apps — it automatically loads the correct glyph set for my and th locales

Advanced Usage​

For advanced i18next features (pluralization, interpolation, namespaces), refer to the i18next documentation.