Skip to main content
Version: 2.1.1

Localization

ABP React provides multi-language support with dynamic resource loading.

useLocalization Hook

The useLocalization hook provides translation functions:

import { useLocalization } from '@abpjs/core';

function LocalizationExample() {
const { t, instant } = useLocalization();

return (
<div>
<h1>{t('Welcome')}</h1>
<p>{t('HelloUser', { name: 'John' })}</p>
<button>{t('Save')}</button>
</div>
);
}

API Reference

useLocalization Returns

PropertyTypeDescription
t(key: string, params?: object) => stringTranslate a key with optional interpolation
instant(key: string, params?: object) => stringSynchronous translation

Translation with Parameters

Pass parameters for dynamic content:

const { t } = useLocalization();

// Assuming localization resource has: "HelloUser": "Hello, {name}!"
<p>{t('HelloUser', { name: 'John' })}</p>
// Output: "Hello, John!"

// With multiple parameters
// "ItemsFound": "Found {count} items in {category}"
<p>{t('ItemsFound', { count: 5, category: 'Books' })}</p>
// Output: "Found 5 items in Books"

Using Resource Keys

ABP organizes translations into resources. Access them with the resource prefix:

const { t } = useLocalization();

// From AbpIdentity resource
<p>{t('AbpIdentity::UserName')}</p>

// From AbpAccount resource
<p>{t('AbpAccount::Login')}</p>

// From your custom resource
<p>{t('MyApp::WelcomeMessage')}</p>

Available Languages

Access available languages from the configuration:

import { useConfig } from '@abpjs/core';

function LanguageSelector() {
const { localization } = useConfig();
const languages = localization?.languages || [];
const currentLanguage = localization?.currentCulture?.name;

return (
<select value={currentLanguage}>
{languages.map((lang) => (
<option key={lang.cultureName} value={lang.cultureName}>
{lang.displayName}
</option>
))}
</select>
);
}

Changing Language

To change the language, update the URL or use a language switcher that reloads the configuration:

function LanguageSwitcher() {
const changeLanguage = (cultureName: string) => {
// Set culture cookie and reload
document.cookie = `.AspNetCore.Culture=c=${cultureName}|uic=${cultureName}; path=/`;
window.location.reload();
};

return (
<button onClick={() => changeLanguage('tr')}>
Türkçe
</button>
);
}

RTL (Right-to-Left) Support

The useDirection hook provides RTL support for Arabic, Hebrew, Persian, Urdu, and other RTL languages:

import { useDirection } from '@abpjs/core';

function MyComponent() {
const { direction, isRtl, startSide, endSide } = useDirection();

return (
<div dir={direction}>
{/* direction: 'rtl' or 'ltr' */}
{/* isRtl: boolean */}
{/* startSide: 'left' (LTR) or 'right' (RTL) */}
{/* endSide: 'right' (LTR) or 'left' (RTL) */}
<p>Content flows in {direction} direction</p>
</div>
);
}

useDirection Returns

PropertyTypeDescription
direction'ltr' | 'rtl'Current text direction
isRtlbooleanWhether current language is RTL
startSide'left' | 'right'Start side based on direction
endSide'left' | 'right'End side based on direction

Using with Chakra UI Components

import { useDirection } from '@abpjs/core';
import { Menu } from '@chakra-ui/react';

function DirectionalMenu() {
const { endSide } = useDirection();

return (
<Menu.Root positioning={{ placement: `${endSide}-start` }}>
{/* Menu opens on the correct side based on language direction */}
<Menu.Trigger>Open Menu</Menu.Trigger>
<Menu.Content>
<Menu.Item value="item1">Item 1</Menu.Item>
<Menu.Item value="item2">Item 2</Menu.Item>
</Menu.Content>
</Menu.Root>
);
}

selectLocalizationString (v1.0.0)

For Redux-based localization with interpolation:

import { selectLocalizationString } from '@abpjs/core';
import { useSelector } from 'react-redux';

function Component() {
// Simple usage
const greeting = useSelector(selectLocalizationString('HelloWorld'));

// With default value
const message = useSelector(
selectLocalizationString({ key: 'WelcomeMessage', defaultValue: 'Welcome!' })
);

// With interpolation (positional parameters)
const userGreeting = useSelector(
selectLocalizationString('Hello, {0}!', 'John')
);

// Multiple parameters
const itemsFound = useSelector(
selectLocalizationString('Found {0} items in {1}', '5', 'Books')
);

return <div>{greeting}</div>;
}

Syntax

selectLocalizationString(
key: string | Config.LocalizationWithDefault,
...interpolateParams: string[]
)

Parameters

ParameterTypeDescription
keystring | Config.LocalizationWithDefaultLocalization key or object with key and defaultValue
interpolateParamsstring[]Values to interpolate into placeholders

Key Formats

// Resource-prefixed key
selectLocalizationString('AbpIdentity::UserName')

// Default resource (uses defaultResourceName from config)
selectLocalizationString('Welcome')

// With default value
selectLocalizationString({ key: 'CustomKey', defaultValue: 'Fallback' })

LocalizationService Enhancements (v1.1.0)

The LocalizationService methods now accept Config.LocalizationWithDefault in addition to string keys:

import { useAbp } from '@abpjs/core';

function LocalizationExample() {
const { localizationService } = useAbp();

// String key (existing)
const text = localizationService.get('MyKey');

// Object with default value (new in v1.1.0)
const textWithDefault = localizationService.get({
key: 'MyKey',
defaultValue: 'Fallback text'
});

// With interpolation
const greeting = localizationService.get('Hello {0}!', 'World');

return <div>{greeting}</div>;
}

Affected Methods

MethodDescription
get()Get localized string
instant()Synchronous translation
t()Alias for get()

Config.LocalizationParam Type

import { Config } from '@abpjs/core';

// Union type for localization keys
type LocalizationParam = string | Config.LocalizationWithDefault;

// Usage
const key: Config.LocalizationParam = {
key: 'MyKey',
defaultValue: 'Default text'
};

Date.toLocalISOString() (v1.1.0)

Returns ISO string in local timezone (unlike toISOString() which returns UTC):

const date = new Date();

// Standard - returns UTC
date.toISOString(); // "2026-01-31T13:15:00.000Z"

// New - returns local timezone
date.toLocalISOString(); // "2026-01-31T16:15:00.000+03:00"

This is useful when you need to send dates to APIs that expect local timezone information.