Shoplit
Getting Started

Internationalization (i18n)

Learn how Shoplit handles internationalization (i18n) with built-in configuration, language settings, translation files, and formatting utilities.

Overview

Shoplit offers integrated support for internationalization (i18n), enabling your application to display locale-specific content—including formatted dates, times, and currencies—while also facilitating language management and time zone support.

Configuration

Next.js Integration

The Next.js configuration is set up in the shoplit/next.config.ts file. This file imports the custom i18n configuration required by the application.

import { i18n } from './next-i18next.config';
 
module.exports = {
  i18n,
};

i18n Configuration

The i18n configuration is defined in a dedicated configuration file. This file sets the default locale and explicitly lists all supported locales for the application.

module.exports = {
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'ar', 'es', 'de', 'ch'],
  },
  reloadOnPrerender: true,
};

Note: The reloadOnPrerender setting ensures that translation files are reloaded automatically during development when changes are detected.

Language Settings

The language settings are established in shoplit/i18n/config.ts. This file defines the metadata for each language, including its code, display name, text direction, and corresponding flag icon.

export interface Language {
	code: string;
	name: string;
	shortName: string;
	direction: 'ltr' | 'rtl';
	flag: string;
}
 
export const languages: Language[] = [
	{
		code: 'en',
		name: 'English',
		shortName: 'EN',
		direction: 'ltr',
		flag: '/media/flags/united-states.svg',
	},
	{
		code: 'ar',
		name: 'Arabic',
		shortName: 'AR',
		direction: 'rtl',
		flag: '/media/flags/saudi-arabia.svg',
	},
	{
		code: 'es',
		name: 'Spanish',
		shortName: 'ES',
		direction: 'ltr',
		flag: '/media/flags/spain.svg',
	},
	{
		code: 'de',
		name: 'German',
		shortName: 'DE',
		direction: 'ltr',
		flag: '/media/flags/germany.svg',
	},
	{
		code: 'ch',
		name: 'Chinese',
		shortName: 'CH',
		direction: 'ltr',
		flag: '/media/flags/china.svg',
	},
];

Translation Files

Translation strings are stored as JSON files in the shoplit/i18n/messages folder. Each file corresponds to a specific locale.

English Translations

{
  "common": {
    "enums": {
      "category_status": {
        "active": "Active",
        "inactive": "Inactive"
      }
    },
    "messages": {
      "unauthorized": "Unauthorized access.",
      "system_error": "An error occurred. Please try again later.",
      "invalid_input": "Invalid input. Please review your data and try again.",
      "data_not_found": "Requested data not found.",
      "delete_restricted_error": "Unable to delete this record as it is linked to other records."
    },
    "confirm-dimiss-dialog": {
      "title": "Discard changes?",
      "description": "You have unsaved changes. Are you sure you want to close this dialog?",
      "cancel": "Cancel",
      "confirm": "Discard changes"
    }
  },
  "components": {
    "data-grid": {
      "empty": {
        "title": "No data",
        "description": "No data available to display."
      }
    }
  },
  "modules": {
    "categories": {
      "meta": {
        "title": "Categories"
      },
      "list": {
        // ... additional keys for the categories module ...
      }
    }
  }
}

Using Translations in Components

Within your React components, use the useTranslation hook to access localized strings. For example:

import { useTranslation } from 'next-i18next';
 
const MyComponent = () => {
  const { t } = useTranslation('common');
 
  return (
    <div>
      <p>{t('messages.system_error')}</p>
    </div>
  );
};
 
export default MyComponent;

Tip: Use dot notation (e.g., messages.system_error) to access nested translation keys. The provided namespace (such as 'common') corresponds to the top-level key in the JSON translation files.

Formatting Utilities

Shoplit provides utility functions for localized formatting of dates, times, and currencies in shoplit/i18n/format.ts.

Date and Time Formatting

  • formatDate(date) – Formats a date in a localized style (e.g., "Dec 7, 2024").
  • formatDateTime(date) – Formats a date and time together (e.g., "Dec 7, 2024, 11:41 PM").
  • formatTime(date) – Formats only the time (e.g., "11:41 PM").

Example usage:

import { formatDate, formatMoney } from 'shoplit/i18n/format';
 
const dateString = formatDate(new Date());
const price = formatMoney(100); // Defaults to USD, or you can specify another currency if needed

Currency Formatting

  • formatMoney(amount, currency?) – Converts a numeric value to a localized currency string. The default currency is USD, but a different currency can be specified.

Time Zones Utility

The helper in shoplit/i18n/timezones.ts provides a list of supported time zones. Each timezone object includes a label (combining the GMT offset and the name), a unique value, and an offset for sorting.

import { getTimeZones } from 'shoplit/i18n/timezones';
 
// Retrieve the formatted list of supported time zones
const timeZones = getTimeZones();