Skip to content

i18n

i18next

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".

В то же время часто для локализации сайта в большинстве случаев требуются очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n.

В частности, обычно нужны:

  • Нахождение перевода по составному ключу - t("finance.transactions.deposit")
  • Перевод с параметром - t("hello-message", "John")
  • Массивы для списков или параграфов текста

Данный функционал с сохранением реактивности (смена языка сайта налету) можно получить простой composable функцией.

useI18nLight

Вот чистая реализация вышеуказанного функционала в 70 строчек супротив полутора мегабайт без каких-либо зависимостей.

Использование

Подключение и инициализация в main.ts:

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

const { initI18n } = useI18n();

initI18n();

Json файлы локалей находятся по умолчанию в src/utils/locales

Пример использования в компоненте:

vue
<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);
}
</script>
<template>
<div>
    i18n test -
    <button
      type="button"
      @click="changeLocale()"
    >
      {{ t('msg') }} ({{ locale.code }})
    </button>
  </div>
</template>

i18next расширения

У i18next есть расширение для Vue DevTools (довольно бесполезное), и есть расширение I18next Ally для VS Code (весьма полезное). Так вот i18next Ally работает с новой реализацией если в package.json будет прописан пакет vue-i18n в dependencies (в коде подключать его не надо). Рекомендую. Оба расширения, впрочем, неплохо едят ресурсы, так что пользоваться ими лучше по надобности.

В итоге

JavaScript бандл после билда меньше на 50 Кб по сравнению с i18next. Нужный функционал есть.