From 2d5f757e085b8cb0f0a506bbd70340806f96e3c0 Mon Sep 17 00:00:00 2001 From: denis moshkin Date: Wed, 18 Dec 2024 16:57:48 +0300 Subject: [PATCH 01/38] start ru translation --- docs/.vitepress/config/index.mts | 12 +- docs/.vitepress/config/ru.mts | 128 +++++++++ docs/.vitepress/theme/index.mts | 3 +- docs/.vitepress/translation-status.json | 4 + docs/ru/guide/essentials/a-crash-course.md | 261 ++++++++++++++++++ .../guide/essentials/conditional-rendering.md | 148 ++++++++++ docs/ru/guide/essentials/event-handling.md | 156 +++++++++++ docs/ru/guide/index.md | 59 ++++ docs/ru/index.md | 17 ++ docs/ru/installation/index.md | 18 ++ 10 files changed, 803 insertions(+), 3 deletions(-) create mode 100644 docs/.vitepress/config/ru.mts create mode 100644 docs/ru/guide/essentials/a-crash-course.md create mode 100644 docs/ru/guide/essentials/conditional-rendering.md create mode 100644 docs/ru/guide/essentials/event-handling.md create mode 100644 docs/ru/guide/index.md create mode 100644 docs/ru/index.md create mode 100644 docs/ru/installation/index.md diff --git a/docs/.vitepress/config/index.mts b/docs/.vitepress/config/index.mts index e3fe97898..6bdada4b2 100644 --- a/docs/.vitepress/config/index.mts +++ b/docs/.vitepress/config/index.mts @@ -3,6 +3,7 @@ import { frConfig } from './fr.mts' import { zhConfig } from './zh.mts' import { sharedConfig } from './shared.mts' import { defineConfig } from 'vitepress' +import { ruConfig } from './ru.mts' export default defineConfig({ ...sharedConfig, @@ -10,6 +11,13 @@ export default defineConfig({ locales: { root: { label: 'English', lang: 'en-US', link: '/', ...enConfig }, fr: { label: 'Français', lang: 'fr-FR', link: '/fr/', ...frConfig }, - zh: { label: '简体中文 (校对中)', lang: 'zh-CN', link: '/zh/', ...zhConfig } - } + zh: { + label: '简体中文 (校对中)', + lang: 'zh-CN', + link: '/zh/', + ...zhConfig + }, + ru: { label: 'Русский', lang: 'ru-RU', link: '/ru/', ...ruConfig } + }, + }) diff --git a/docs/.vitepress/config/ru.mts b/docs/.vitepress/config/ru.mts new file mode 100644 index 000000000..e0624c9af --- /dev/null +++ b/docs/.vitepress/config/ru.mts @@ -0,0 +1,128 @@ +import type { DefaultTheme, LocaleSpecificConfig } from 'vitepress' +export const META_URL = '' +export const META_TITLE = 'Vue Test Utils' +export const META_DESCRIPTION = 'Официальный набор инструментов тестирования для Vue.js 3' + +export const ruConfig: LocaleSpecificConfig = { + description: META_DESCRIPTION, + head: [ + ['meta', { property: 'og:url', content: META_URL }], + ['meta', { property: 'og:title', content: META_TITLE }], + ['meta', { property: 'og:description', content: META_DESCRIPTION }], + ['meta', { property: 'twitter:url', content: META_URL }], + ['meta', { property: 'twitter:title', content: META_TITLE }], + ['meta', { property: 'twitter:description', content: META_DESCRIPTION }] + ], + themeConfig: { + docFooter: { + prev: 'Предыдущая', + next: 'Следующая', + }, + outlineTitle: "Содержание", + editLink: { + pattern: 'https://github.com/vuejs/test-utils/edit/main/docs/:path', + text: 'Предложить перевод страницы на GitHub' + }, + nav: [ + { text: 'Руководство', link: '/ru/guide/' }, + { text: 'API', link: '/api/' }, + { text: 'Миграция с Vue 2', link: '/migration/' }, + { + text: 'Changelog', + link: 'https://github.com/vuejs/test-utils/releases' + } + ], + sidebar: { + '/': [ + { + text: 'Установка', + link: '/ru/installation/' + }, + { + text: 'Основы', + items: [ + { text: 'Приступая к изучению', link: '/ru/guide/' }, + { + text: 'Ускоренный курс', + link: '/ru/guide/essentials/a-crash-course' + }, + { + text: 'Условная отрисовка', + link: '/ru/guide/essentials/conditional-rendering' + }, + { + text: 'Тестирование генерации событий', + link: '/ru/guide/essentials/event-handling' + }, + { text: 'Testing Forms', link: '/guide/essentials/forms' }, + { + text: 'Passing Data to Components', + link: '/guide/essentials/passing-data' + }, + { + text: 'Write components that are easy to test', + link: '/guide/essentials/easy-to-test' + } + ] + }, + { + text: 'Углубленно', + items: [ + { text: 'Slots', link: '/guide/advanced/slots' }, + { + text: 'Asynchronous Behavior', + link: '/guide/advanced/async-suspense' + }, + { + text: 'Making HTTP Requests', + link: '/guide/advanced/http-requests' + }, + { text: 'Transitions', link: '/guide/advanced/transitions' }, + { + text: 'Component Instance', + link: '/guide/advanced/component-instance' + }, + { + text: 'Reusability and Composition', + link: '/guide/advanced/reusability-composition' + }, + { text: 'Testing v-model', link: '/guide/advanced/v-model' }, + { text: 'Testing Vuex', link: '/guide/advanced/vuex' }, + { text: 'Testing Vue Router', link: '/guide/advanced/vue-router' }, + { text: 'Testing Teleport', link: '/guide/advanced/teleport' }, + { + text: 'Stubs and Shallow Mount', + link: '/guide/advanced/stubs-shallow-mount' + }, + { + text: 'Testing Server-side Rendering', + link: '/guide/advanced/ssr' + } + ] + }, + { + text: 'Дополнительные темы', + items: [ + { text: 'Плагины', link: '/guide/extending-vtu/plugins' }, + { + text: 'Сообщество и обучение', + link: '/guide/extending-vtu/community-learning' + } + ] + }, + { + text: 'Ответы на вопросы', + link: '/guide/faq/' + }, + { + text: 'Миграция с Vue 2', + link: '/migration/' + }, + { + text: 'API руководство', + link: '/api/' + } + ] + } + } +} diff --git a/docs/.vitepress/theme/index.mts b/docs/.vitepress/theme/index.mts index 30162d817..b3cf94124 100644 --- a/docs/.vitepress/theme/index.mts +++ b/docs/.vitepress/theme/index.mts @@ -5,7 +5,8 @@ import status from '../translation-status.json' import './custom.css' const i18nLabels = { fr: 'La traduction est synchronisée avec les docs du ${date} dont le hash du commit est ${hash}.', - zh: '该翻译已同步到了 ${date} 的版本,其对应的 commit hash 是 ${hash}
同时该文档仍处于校对中,如有任何疑问或想参与校对工作,请移步这里了解更多。' + zh: '该翻译已同步到了 ${date} 的版本,其对应的 commit hash 是 ${hash}
同时该文档仍处于校对中,如有任何疑问或想参与校对工作,请移步这里了解更多。', + ru: "Последняя дата обновления документации: ${date}" } diff --git a/docs/.vitepress/translation-status.json b/docs/.vitepress/translation-status.json index b7a6d4c97..05c9fedaf 100644 --- a/docs/.vitepress/translation-status.json +++ b/docs/.vitepress/translation-status.json @@ -6,5 +6,9 @@ "zh": { "hash": "7c55128", "date": "2024-11-28" + }, + "ru": { + "hash": "96ef276", + "date": "2024-12-09" } } \ No newline at end of file diff --git a/docs/ru/guide/essentials/a-crash-course.md b/docs/ru/guide/essentials/a-crash-course.md new file mode 100644 index 000000000..460518897 --- /dev/null +++ b/docs/ru/guide/essentials/a-crash-course.md @@ -0,0 +1,261 @@ +# Ускоренный курс + +Давайте уже начнем! Давайте изучим Vue Test Utils (VTU), создав простое Todo приложение и напишем тесты по ходу дела. Это руководство покажет, как: + +- Добавлять компоненты +- Находить элементы +- Заполнять формы +- Вызывать события + +## Приступая к изучению + +Мы начнем с простого `TodoApp` компонента с единственной задачей: + +```vue + + + +``` + +## Первый тест - задача отрисована + +Первый тест, который мы напишем будет проверка отрисовки задачи. Давайте посмотрим первый тест, далее обсудим каждую часть: + +```js +import { mount } from '@vue/test-utils' +import TodoApp from './TodoApp.vue' + +test('renders a todo', () => { + const wrapper = mount(TodoApp) + + const todo = wrapper.get('[data-test="todo"]') + + expect(todo.text()).toBe('Learn Vue.js 3') +}) +``` + +Мы начнем с импортирования `mount` - это главный способ отрисовать компонент. Вы объявляете тест при помощи `test` функции, с коротким описанием теста. `test` и `expect` глобально доступны в большинстве программ тестирования (в этом примере используем [Jest](https://jestjs.io/en/)). Если `test` и `expect` выглядит непонятно, Jest документация имеет [больше простых примеров](https://jestjs.io/docs/en/getting-started) как использовать и работать с ними. + +Далее мы вызываем `mount` и передаем компонент в качестве первого аргумента - это то, что вам придется делать почти в каждом тесте. По соглашению, мы присваиваем результат переменной с названием `wrapper`, поскольку `mount` предоставляет простой "wrapper" вокруг приложения с некоторыми удобными методами для тестирования. + +Наконец, мы используем другой глобальный метод общий для многих программ тестирования, в том числе и Jest, - `expect`. Идея в том, что мы утверждаем или _ожидаем_, что реальное значение будет таким, каким мы его себе представляем. В данном случае, мы ищем html-элемент с селектором `data-test="todo"` в DOM (Document Object Model), это будет выглядеть примерно так: `
...
`. После, мы вызываем `text` метод для получения содержимого, которое мы ожидаем: `'Learn Vue.js 3'`. + +> Использование `data-test` селекторов не обязательно, но это может сделать твои тесты более гибкими. Классы и идентификаторы меняются по мере роста приложения, но при использовании `data-test` другими разработчиками будет более понятно, что эти элементы нужны для тестов и не должны изменяться. + +## Делаем тест успешным + +Если мы запустим этот тест, то он выполниться с такой ошибкой: `Unable to get [data-test="todo"]` (`Не удалось получить [data-test="todo"]`). Потому что мы не отрисовываем никакую задачу, поэтому вызов `get()` возвращается с ошибкой и не возвращает "wrapper" (помните, что VTU оборачивает все компоненты и DOM элементы в "wrapper" с некоторыми удобными методами). Давайте обновим `