Введение

В моем предыдущем рассказе Как создать многоязычное приложение Vue 3 + Vite мы создали многоязычное приложение с помощью подключаемого модуля Vue I18n, где мы сохранили все сообщения локали во внешних файлах json. Затем файлы были предварительно скомпилированы и объединены в процессе сборки. Таким образом, все локали включены в основной пакет и доступны сразу после загрузки приложения. Однако вы можете захотеть включить в основной пакет только несколько локалей, а остальные обслуживать асинхронно по мере необходимости. Это может уменьшить размер пакета в проектах со многими локалями.

В этом руководстве

Мы расширяем приложение Vue 3 + Vite из прошлой истории, чтобы связать в основном чанке только несколько локалей, а остальные подгружаются асинхронно по мере необходимости.

Существует несколько способов реализации асинхронной загрузки локалей. В этом руководстве файлы сообщений локали, которые не включены в основной блок, предоставляются в виде статических файлов json. Приложение Vue 3 на стороне клиента может затем загрузить файл ресурсов локали, когда это необходимо, используя API выборки. После загрузки локали сообщения локали должны быть скомпилированы и добавлены в глобальный экземпляр I18n.

Этот подход требует размещения файлов ресурсов локали в двух разных каталогах.

Предпосылки

  • У вас есть базовое понимание того, как работать с Vue 3 + Vite, Composition API и синтаксисом <script setup>.
  • node.js установлен на вашем компьютере
  • Вы прочитали и поняли мою предыдущую историю, так как она служит основой

Базовое приложение

Клонируйте приложение Vue 3 + Vite с помощью подключаемого модуля Vue I18n из прошлой истории, открыв терминал в нужном рабочем каталоге и выполнив следующую команду:

git clone https://github.com/robinkloeckner/vue3_vite_i18n

В качестве альтернативы вы можете скачать исходный код с GitHub.

Затем перейдите в корневой каталог проекта, установите все модули и запустите сервер разработки:

cd vue_vite_i18n
npm install
npm run dev

Если вы сейчас перейдете к http://localhost:5173/, вы увидите, что приложение похоже на приложение, которое поставляется со стандартной установкой Vue 3 + Vite. Однако приложение дополнено подключаемым модулем Vue I18n, который предоставляет множество функций для локализации вашего приложения, а также подключаемым модулем unplugin-vue-i18n, который обеспечивает компилятор для преобразования сообщений локали из выделенных файлов json в функции JavaScript в процессе сборки. Далее к компоненту HelloWorld.vue добавляется компонент LocaleSelect.vue для изменения локали. Файлы ресурсов локали расположены в src/locales/, которые затем загружаются в файл main.js перед созданием экземпляра Vue I18n. Подробное описание исходного кода читайте в моей предыдущей истории.

Базовый проект имеет следующую структуру папок:

public/
  favicon.ico
src/
  assets/
    ...
  components/
    icons/
      ...
    HelloWorld.vue
    LocaleSeclect.vue
    TheWelcome.vue
    WelcomeItem.vue
  locales/
    de.json
    en.json
  App.vue
  main.js
.gitignore
index.html
package.json
package-lock.json
README.md
vite.config.js

Иллюстрация работающего приложения:

Добавить новую локаль

Затем мы добавляем новую локаль, которая позже должна быть загружена асинхронно. Поскольку мы хотим использовать его как статический файл, проще всего поместить его в каталог public/, потому что папка копируется в каталог dist/ во время сборки. Поэтому создайте новый файл es.json в public/ со следующим содержимым:

Конфигурация Vite

В файле конфигурации vite.config.js базового приложения VueI18nPlugin уже добавлено и содержит путь к файлам ресурсов локали, которые будут объединены в процессе сборки.

В дополнение к этому нам нужно установить опцию runtimeOnly в false, чтобы включить компилятор сообщений в бандл. Компилятор сообщений, в свою очередь, нужен для преобразования сообщений локали из файла JSON в функции JavaScript (см. документацию здесь и здесь).

Окончательный vite.config.js выглядит следующим образом:

Настройка i18n

Чтобы все было организовано, мы поместим все, что связано с подключаемым модулем Vue I18n, в отдельный файл. Поэтому создайте файл i18n.js в каталоге src/ со следующим содержимым:

Сначала мы импортируем сообщения локали из каталога src/locales/, используя подключаемый модуль unplugin-vue-i18n (строка 2). После этого мы определяем массив, содержащий все локали, которые мы хотим предложить, в строке 5. Массив будет использоваться позже для создания выпадающего меню для изменения локали. В строках с 8 по 14 мы создаем экземпляр Vue I18n. Поскольку мы хотим использовать Composition API с синтаксисом <script setup>, для переменной legacy должно быть установлено значение false. Мы также устанавливаем локаль по умолчанию на английский язык. Подробное объяснение опций смотрите в моей предыдущей истории.

Функция setLocale() будет вызываться, когда пользователь выбирает новую локаль, тогда как параметр locale будет содержать выбранную локаль. Все доступные в настоящее время локали перечислены в свойстве availableLocales экземпляра Vue I18n. Если выбранная локаль не включена в этот список, ее необходимо получить с сервера с помощью метода fetch(). Это делается в отдельной функции loadLocale(), которая возвращает обещание. Если запрос выполнен успешно, сообщения локали назначаются константе messages. В случае ошибки messages будет неопределенным. В этом случае мы возвращаемся из функции без изменения локали (строка 24). Если запрос выполнен успешно, новая локаль добавляется в глобальный экземпляр I18n в строке 28. В фоновом режиме локаль автоматически компилируется в JavaScript. В конце локаль меняется в строке 32.

Переключатель локали

Далее необходимо изменить элемент <select> из компонента LocaleSwitch.vue. Мы по-прежнему хотим синхронизировать значение элемента <select> с локалью, установленной в экземпляре Vue I18n. Однако, в отличие от текущей реализации, мы не хотим напрямую менять локаль. Вместо этого мы хотим использовать пользовательскую функцию setLocale() из файла i18n.js, потому что именно оттуда мы получаем локали, если они еще недоступны. Кроме того, опции элемента <select> должны создаваться по списку всех доступных локалей, а не по тем, что собраны в основном чанке.

Поэтому измените компонент LocaleSelect.vue следующим образом:

Элемент <select> заполняется опциями путем циклического просмотра списка всех доступных локалей, allLocales, как определено в файле i18n.js, при этом имя локали устанавливается как значение опции с помощью :value="locale".

В строке 8 мы привязываем значение элемента <select> к локали, установленной в глобальном экземпляре I18n с помощью :value="$i18n.locale". При изменении локали элемент <select> вызывает функцию setLocale(), устанавливая @change="setLocale($event.target.value)" с выбранной локалью, установленной в качестве параметра.

Окончательное приложение имеет следующую структуру папок:

public/
  locales/
    es.json
  favicon.ico
src/
  assets/
    ...
  components/
    icons/
      ...
    HelloWorld.vue
    LocaleSeclect.vue
    TheWelcome.vue
    WelcomeItem.vue
  locales/
    de.json
    en.json
  App.vue
  i18n.js
  main.js
.gitignore
index.html
package.json
package-lock.json
README.md
vite.config.js

Запуск приложения

Выполните производственную сборку и запустите локальный сервер предварительного просмотра с помощью:

npm run build
npm run preview

Затем откройте браузер и его инструменты разработчика. Перейдите на вкладку сети и перейдите к http://localhost:4173. Если вы измените язык с английского на немецкий (с en на de), вы не увидите никаких сетевых действий, поскольку обе локали включены в основной фрагмент, который Vite создает во время сборки. Однако, когда вы выберете испанский язык (es), вы увидите, что файл локали es.json загружается с локального сервера предварительного просмотра. Если вы измените язык обратно на английский или немецкий, а затем снова выберете испанский, языковой стандарт переключится на испанский без повторной загрузки с сервера.

Если испанская локаль не может быть выбрана правильно, проверьте консоль браузера на наличие ошибок и убедитесь, что runtimeOnly установлено в false в файле конфигурации vite.config.js.

Краткое содержание

В проектах Vue со многими локалями их асинхронная загрузка по мере необходимости может уменьшить начальный размер пакета приложения. Один из способов реализовать это — сохранить сообщение о локали в файлах JSON и получить их с сервера, когда они понадобятся. Затем файлы JSON необходимо скомпилировать на стороне клиента и добавить экземпляр Vue I18n.

Исходный код

GitHub: Базовое приложение без отложенной загрузки

GitHub: Последнее приложение с отложенной загрузкой

Спасибо за чтение :-)

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу