Существует два способа перевода веб-сайта Vue.js. Маршрут разработчика — Vue I18n: вы перемещаете каждый фрагмент текста в файлы перевода, ссылаетесь на него с помощью $t('key') или useI18n()и предоставьте файл для каждого языка. Маршрут без кода — это уровень перевода веб-сайта: вы добавляете один скрипт к своему index.html, и он переводит визуализированную страницу, включая контент, который появляется после навигации, не изменяя ваши компоненты. Vue I18n имеет смысл, когда ваша команда владеет всем текстом и хочет, чтобы он был в кодовой базе. Уровень перевода работает быстрее, когда вам нужен весь сайт на многих языках, включая контент из CMS или API.
Ключевые выводы
- Vue I18n — стандартная библиотека интернационализации для Vue. Вы создаете
i18nэкземпляр сcreateI18n, зарегистрируйте его с помощьюapp.use(i18n), и визуализировать текст с помощью$t()в шаблонах илиt()отuseI18n(). - Его устаревший API устарел в Vue I18n v11 и планируется удалить в v12, поэтому новые проекты должны использовать Composition API.
- Вам все еще нужно обрабатывать переведенные URL-адреса, hreflang,
<html lang>, и перевод текста, которого нет в вашем коде (контент CMS, данные о продукте). - Уровень перевода, такой как ConveyThis, не требует изменений кода: добавьте сценарий, выберите языки и отредактируйте переводы в визуальном редакторе.
- При любом методе рендеринг только на стороне клиента является слабым местом для SEO. Используйте Nuxt или предварительный рендеринг, если важен поисковый трафик на других языках.
Вариант 1: Перевод приложения Vue с помощью Vue I18n
Vue I18n — плагин интернационализации, поддерживаемый командой Intlify. Минимальная настройка Composition API занимает четыре шага.
1. Установить
npm install vue-i18n2. Создайте экземпляр i18n со своими сообщениями
// src/i18n.js
import { createI18n } from 'vue-i18n';
const messages = {
en: {
nav: { home: 'Home', pricing: 'Pricing' },
hero: { title: 'Translate your store in minutes' },
},
fr: {
nav: { home: 'Accueil', pricing: 'Tarifs' },
hero: { title: 'Traduisez votre boutique en quelques minutes' },
},
};
export const i18n = createI18n({
legacy: false, // use the Composition API
locale: 'en', // active language
fallbackLocale: 'en', // used when a key is missing
messages,
});3. Регистрация это с вашим приложением
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import { i18n } from './i18n';
createApp(App).use(i18n).mount('#app');4. Используйте его в компонентах
<script setup>
import { useI18n } from 'vue-i18n';
const { t, locale } = useI18n();
</script>
<template>
<h1>{{ t('hero.title') }}</h1>
<select v-model="locale">
<option value="en">English</option>
<option value="fr">Français</option>
</select>
</template>В документации Vue I18n описаны ключевые варианты: locale устанавливает активный язык, fallbackLocale используется, когда ключ перевода отсутствует, и messages содержит переводы по регионам. Также отмечается, что Legacy API “устарел Vue I18n v11, и Vue I18n v12 удален”, поэтому предпочтительнее legacy: false и useI18n() в новом коде.
Чего Vue I18n вам не делает
Vue I18n переводит строки, которые вы ему даете. Многоязычному веб-сайту нужно нечто большее:
- Кто-то должен писать каждую строку на каждом языке и синхронизировать их по мере изменения приложения. Отсутствующие ключи возвращаются на английский язык без какого-либо предупреждения.
- Сообщения в блогах, описания продуктов и все, что получено из CMS или API, отсутствуют в ваших файлах сообщений. Для них вам понадобится отдельный процесс локализации.
- Языковые URL-адреса зависят от вас. Добавьте локаль к своим маршрутам (
/fr/pricing) с маршрутизатором Vue и сохраните маршрутизатор иlocaleсинхронно. Google рекомендует использовать отдельный URL-адрес для каждого языка, а не переключаться с помощью cookie-файлов или настроек браузера (Центр поиска Google). - То же самое касается тегов hreflang и
<html lang>. Каждая языковая версия должна перечислять себя и все остальные (Центр поиска Google). Обновлятьdocument.documentElement.langкогда меняется локаль. - Для цен и дат используйте форматирование номеров и дат Vue I18n (встроенное в браузер
IntlAPI), а не форматировать их вручную. - Если вы поддерживаете много языков, загружайте сообщения каждой локали по требованию, а не объединяйте их все.
Практические советы
- Сохраняйте семантику ключей (
checkout.payButton), а не на основе предложений, поэтому изменения копирования не ломают ключи. - Не объединяйте строки (
t('hello') + name); использовать интерполяцию (t('hello', { name })) чтобы переводчики могли изменить порядок слов. - Используйте функции плюрализации вместо
if (count === 1); во многих языках существует более двух форм множественного числа. - Оставьте место в макете для более длинного текста; немецкий и французский языки часто длиннее английского.
- Если вам нужен арабский или иврит, заранее протестируйте языки справа налево.
Вариант 2: Перевести сайт Vue без кода, с ConveyThis
Если вы не хотите перемещать каждую строку в файлы или большая часть вашего контента поступает из CMS или API, уровень перевода поможет вам сделать это быстрее. ConveyThis переводит то, что ваше приложение Vue отображает в браузере.
Настройка занимает около 10 минут:
- Создать учетную запись ConveyThis и добавьте свой домен.
- Выберите исходный язык и целевые языки (поддерживается 210).
- Скопируйте фрагмент JavaScript с панели управления (см JavaScript руководство по интеграции).
- Вставьте его в точку входа HTML вашего приложения перед закрытием
</head>или</body>ярлык. В проекте Vite этоindex.htmlв корне проекта; в проекте Vue CLI этоpublic/index.html. - Развертывать. Появится переключатель языка, и ваш контент будет переведен автоматически.
В одностраничном приложении скрипт ConveyThis отслеживает страницу на предмет контента, который добавляется или изменяется после загрузки, и отслеживает изменения маршрута на стороне клиента (навигация API истории и изменения хэша). Когда маршрутизатор Vue переходит в новое представление или компонент отображает новый текст, этот текст подхватывается и переводится. Вам не нужно ничего вызывать из ваших компонентов.
Вы сохраняете контроль над выводом:
- Редактируйте любой перевод в контексте с помощью визуального редактора.
- Установите правила глоссария для названий и терминов продуктов (платные планы) и повторно используйте утвержденные переводы с памятью переводов.
- Исключите элементы, которые не должны быть переведены путем добавления
conveythis-no-translateкласс (как исключить сегменты), например имена пользователей или фрагменты кода. - Пригласите рецензентов с командными ролями.
SEO для сайтов Vue
Приложение Vue, созданное исключительно на основе клиента, поставляет почти пустую HTML-оболочку и создает страницу в браузере. Какой бы метод вы ни выбрали, это вредит многоязычному SEO, поскольку переведенный контент отсутствует в исходном HTML. Если поисковый трафик на других языках имеет значение:
- Используйте Nuxt (серверный рендеринг или статическую генерацию) или этап предварительного рендеринга, чтобы содержимое каждой страницы существовало в формате HTML.
- Дайте каждому языку свой URL-адрес. ConveyThis поддерживает подпапки, поддомены или a
?langпараметр, автоматически добавляет теги hreflang и преобразует заголовки страниц, метаописания и JSON-LD. Видеть многоязычное SEO о том, как работают режимы URL. - Проверьте переведенные страницы с помощью функции проверки URL-адресов Google Search Console, чтобы узнать, что на самом деле отображает Google.
Vue I18n против слоя трансляции
| Vue I18n | ConveyThis | |
|---|---|---|
| Изменения кода | Каждая строка перемещена в файлы сообщений | Один тег скрипта |
| Кто переводит | Ваша команда или переводчики, в файлах | Первый черновик машинного перевода, отредактированный в визуальном редакторе |
| Содержимое CMS / API | Нужен отдельный процесс | Переведено со страницы |
| Новый контент | Необходимо добавить в каждый файл локали | Обнаружен и переведен автоматически |
| Языковые URL-адреса и hreflang | Вы их строите | Встроенный |
| Лучше всего подходит для | Пользовательский интерфейс продукта принадлежит разработчикам, несколько языков | Маркетинговые сайты и приложения с большим количеством контента, на многих языках |
Многие команды объединяют их: Vue I18n для основного пользовательского интерфейса приложения, где разработчикам нужен полный контроль, и уровень перевода маркетинговых страниц, документов и контента из CMS.
Концепции, лежащие в основе всего этого, читайте в нашем руководство по интернационализации (i18n). Если вы тоже используете React, см как перевести сайт React.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Как перевести сайт Vue.js?
Либо используйте Vue I18n (перемещайте текст в файлы сообщений на каждом языке и визуализируйте его с помощью $t или useI18n) или добавьте сценарий перевода веб-сайта, например ConveyThis, в index.html, который переводит визуализированную страницу без изменения кода.
Какая библиотека i18n лучше всего подходит для Vue?
Vue I18n — стандартный выбор для Vue 3. Используйте его API композиции (legacy: false), поскольку устаревший API устарел в версии 11.
Работает ли ConveyThis с маршрутизатором Vue?
Да. Скрипт отслеживает изменения маршрута на стороне клиента и отслеживает новый отображаемый контент, поэтому каждое новое представление транслируется, когда пользователи его открывают.
Вредно ли клиентское приложение Vue для многоязычного SEO?
Это сложнее, потому что в исходном HTML-коде нет контента. Для достижения наилучших результатов используйте Nuxt или предварительный рендеринг, отдельные URL-адреса для каждого языка и теги hreflang.
Могу ли я остановить перевод некоторых частей моего приложения Vue?
При ConveyThis добавьте conveythis-no-translate класс для любого элемента. С Vue I18n не передавайте этот текст t().
Чтобы попробовать маршрут без кода на вашем сайте Vue, создать учетную запись ConveyThis и вставьте фрагмент в index.html.