Skip to content



The NPM library for internationalization and localization i18n is very popular, but it has grown very large in recent years. It has a lot of features for localizing dates, numbers, setting the right declensions, RTL language support, downloading locales from the server and a bunch of other things. The i18next site even calls it an "internationalization framework".

At the same time, localization of a site often requires very simple things that take up only a couple of percent of the entire functionality of the i18n heavyweight.

In particular, usually needed:

  • Finding translation by the compound key - t("finance.transactions.deposit")
  • Translation with a parameter - t("hello-message", "John")
  • Arrays for lists or paragraphs of text

This functionality with preserving reactivity (changing the site language on the fly) can be obtained by a simple composable function.


Here is a clean implementation of the above functionality without any dependencies in 70 lines against of one and a half megabytes of i18next.


Connection and initialization in main.ts:

import { useI18n } from "@/composables/useI18nLight";

const { initI18n } = useI18n();


JSON locales files are located by default in src/utils/locales

Example of use in a component:

<script setup lang="ts">
import { useI18n } from "@/composables/useI18nLight";

const { t, locales, locale, setLocale } = useI18n();

function changeLocale() {
  setLocale(locales.find(l => l.code != locale.value.code).code);

    i18n test -
      {{ t('msg') }} ({{ locale.code }})

i18next extensions

i18next has an extension for Vue DevTools (pretty useless), and there is an extension I18next Ally for VS Code (pretty useful). So i18next Ally works with the new implementation if vue-i18n package is specified in package.json in dependencies (you don't need to use it in the code). Recommended. Both extensions, however, consume RAM and CPU resources quite well, so it is better to use them only as needed.

As a result

JavaScript bundle after the build is 50 Kb smaller than with i18next. The necessary functionality is there.