{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2019/02/23/is-react-translated-yet.html","result":{"data":{"markdownRemark":{"html":"<p>Мы рады объявить о работе над поддержкой официальных переводов документации React на другие языки. Благодаря усердным усилиям сообщества React по всему миру, React переводится на <em>более, чем 30 языков</em>! Их можно найти на новой странице — <a href=\"/languages\">переводы</a>.</p>\n<p>Также, переводы для следующих трех языков уже полностью завершены! 🎉</p>\n<ul>\n<li><strong>Испанский: <a href=\"https://es.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">es.reactjs.org</a></strong></li>\n<li><strong>Японский: <a href=\"https://ja.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ja.reactjs.org</a></strong></li>\n<li><strong>Бразильский вариант португальского языка: <a href=\"https://pt-br.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pt-br.reactjs.org</a></strong></li>\n</ul>\n<p>Отдельно хотелось бы поздравить <a href=\"https://github.com/alejandronanez\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Alejandro Ñáñez Ortiz</a>, <a href=\"https://github.com/carburo\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Rainer Martínez Fraga</a>, <a href=\"https://github.com/dmorales\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">David Morales</a>, <a href=\"https://github.com/Darking360\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Miguel Alejandro Bolivar Portilla</a> и всех участвовавших в переводе испанского перевода с тем, что они стали первыми, кто <em>полностью</em> перевёл основные страницы документации!</p>\n<h2 id=\"why-localization-matters\"><a href=\"#why-localization-matters\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Почему важна локализация </h2>\n<p>По React уже проводится множество конференций и митапов по всему миру, но далеко не для всех программистов английский язык является основным. Нам бы очень хотелось поддержать местные сообщества, сделав нашу документацию доступной на наиболее популярных языках.</p>\n<p>Участники React-сообщества уже написали неофициальные переводы на <a href=\"https://github.com/discountry/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">китайском</a>, <a href=\"https://wiki.hsoub.com/React\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">арабском</a> и <a href=\"https://github.com/reactjs/ko.reactjs.org/issues/4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">корейском</a> языках; мы надеемся, что официальный канал этих переводов упростит их поиск, и люди, не говорящие на английском языке, не останутся за бортом.</p>\n<h2 id=\"contributing\"><a href=\"#contributing\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Помощь проекту </h2>\n<p>Если вам хочется помочь с переводом, посетите страницу <a href=\"/languages\">переводов</a> и нажмите на ссылку «‎Contribute»‎ у вашего языка.</p>\n<p>Не можете найти свой язык? Если хотите поддерживать форк перевода на ваш язык, тогда следуйте инструкциям в <a href=\"https://github.com/reactjs/reactjs.org-translation#starting-a-new-translation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">репозитории переводов</a>!</p>\n<h2 id=\"backstory\"><a href=\"#backstory\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Предыстория </h2>\n<p>Здравствуйте! Я <a href=\"https://twitter.com/tesseralis\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Nat</a>! Я могу быть вам известна как <a href=\"https://www.youtube.com/watch?v=Ew-UzGC8RqQ\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">та леди с полиэдрами</a>. Последние несколько недель я помогала команде React координировать процесс переводов. Вот, как я это сделала.</p>\n<p>Поначалу мы использовали SaaS-платформу для обработки переводов от пользователей. Для этого был даже оформлен <a href=\"https://github.com/reactjs/reactjs.org/pull/873\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">пулреквест</a>, и изначально я должна была закончить эту интеграцию. Но мы боялись, что из этого ничего путного не получится, а качество переводов оставит желать лучшего. В первую очередь мы хотели, чтобы переводы не отставали от основного репозитория и не оказывались на «‎свалке».</p>\n<p><a href=\"https://twitter.com/dan_abramov\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Дэн</a> смотивировал меня найти альтернативное решение, и мы натолкнулись на подход <a href=\"https://vuejs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Vue</a> к поддержке своих переводов — при помощи множества форков основного репозитория на Github. В частности, <a href=\"https://jp.vuejs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">японский перевод</a> использовал бота для проверки изменений в английском репозитории и создавал пулреквесты, когда изменения появлялись.</p>\n<p>Нам понравился такой подход по нескольким причинам:</p>\n<ul>\n<li>Для запуска требовалось меньше кода.</li>\n<li>Активные участники каждого репозитория получали стимул следить за качеством.</li>\n<li>Сообщество уже привыкло к GitHub, и его участники мотивированы вносить вклад напрямую в организацию React.</li>\n</ul>\n<p>Мы начали с пробного периода для трех языков: испанского, японского и с упрощенного китайского. Таким образом мы выработали методику и приняли меры, чтобы с будущими переводами не возникало проблем. Я хотела, чтобы команды по переводам имели свободу выбора удобных им инструментов. Единственным требованием был <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/PROGRESS.template.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">чек-лист</a>, описывающий порядок перевода страниц.</p>\n<p>После пробного периода мы были готовы принимать другие переводы. Я создала <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/create.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">скрипт</a>, чтобы автоматизировать создание репозиториев для новых языков, а также сайт <a href=\"https://isreacttranslatedyet.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Is React Translated Yet?</a> (А React уже переведён?), чтобы отслеживать прогресс тех или иных переводов. Уже в первый день мы начали целых <em>10</em> переводов!</p>\n<p>Благодаря этой автоматизации, последующая поддержка проекта по большей части шла гладко. Позже мы создали <a href=\"https://rt-slack-invite.herokuapp.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Slack-канал</a>, чтобы переводчики могли удобно общаться между собой; также я выпустила руководство, которое закрепило <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/maintainer-guide.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">обязанности мейнтейнеров сообщества</a>. Платформа для общения между переводчиками себя показала отлично — к примеру, переводчики арабского, персидского и иврита смогли вместе добиться отображения <a href=\"https://en.wikipedia.org/wiki/Right-to-left\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">текста справа налево</a>!</p>\n<h2 id=\"the-bot\"><a href=\"#the-bot\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Бот </h2>\n<p>Сложнее всего было синхронизировать изменения с английской версией сайта. Сперва мы использовали бота <a href=\"https://github.com/vuejs-jp/che-tsumi\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">che-tsumi</a>, которого разработала команда японского перевода Vue, но позже решили разработать собственного бота, который бы работал бы так, как удобно нам. Если быть точной, то нас не устраивали связанные между собой ишью, которые создавались после <a href=\"https://git-scm.com/docs/git-cherry-pick\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">выборочного применения</a> новых коммитов ботом che-tsumi. А после <a href=\"/blog/2019/02/06/react-v16.8.0.html\">релиза хуков</a> так и вовсе начался полный бардак.</p>\n<p>В итоге мы решили, что вместо выборочного применения каждого коммита целесообразнее будет сливать все новые коммиты в один пулреквест где-то по разу в день. Конфликты сливаются как есть и перечисляются в <a href=\"https://github.com/reactjs/pt-BR.reactjs.org/pull/114\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">пулреквесте</a> в виде чек-листа.</p>\n<p>Создать <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/sync.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">скрипт синхронизации</a> было довольно просто: скачать переведённый репозиторий, добавить в его удалённые репозитории оригинальный, стянуть его изменения и создать пулреквест.</p>\n<p>Проблемой стал поиск места для запуска бота. Я фронтенд-разработчица и, возможно, поэтому такие сервисы как Heroku мне чужды. К слову, ещё до прошлого вторника я запускала скрипт на своём ПК вручную!</p>\n<p>Самая большая загвоздка заключалась в дисковом пространстве. Каждый форк репозитория занимает около 100MB и моему компьютеру нужно несколько минут для скачивания. Форков у нас <em>32</em>, а бесплатные планы большинства платформ для развёртывания, которые я рассматривала, предоставляли лишь 512MB пространства.</p>\n<p>Множество раз пересчитав всё в блокноте, я пришла к решению: удалять каждый репозиторий после выполнения скрипта и ограничивать количество одновременно запущенных скриптов до того, которое могло поддержать хранилище. К счастью, dynos от Heroku имеют интернет-соединение получше моего, и они быстро скачивают даже репозиторий React.</p>\n<p>Были и другие мелкие проблемы. Я попробовала аддон <a href=\"https://elements.heroku.com/addons/scheduler\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Heroku Scheduler</a>, благодаря которому мне не пришлось писать <code class=\"gatsby-code-text\">watch</code>-код, однако он работал нестабильно. Меня <a href=\"https://twitter.com/tesseralis/status/1097387938088796160\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">охватил экзистенциальный кризис в твиттере</a>, когда я не смогла разобраться, как отправлять коммиты из Heroku dyno. Но, в конце концов, моя внутренняя фронтенд-разработчица смогла заставить бот работать!</p>\n<p>Само собой, боту есть куда улучшаться. В данный момент он не проверяет, есть ли открытые пулреквесты перед тем, как отправить очередной. Также ему всё ещё трудно определить точные изменения оригинала, и есть шанс пропустить места, нуждающиеся в переводе. Однако я доверяю мейнтейнерам, которых мы выбрали для решения этих проблем, да и код бота находится в <a href=\"https://github.com/reactjs/reactjs.org-translation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">открытом доступе</a>, если кто-то вдруг решится помочь мне с данными улучшениями!</p>\n<h2 id=\"thanks\"><a href=\"#thanks\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Благодарность </h2>\n<p>Наконец, мне хотелось бы выразить свою признательность следующим людям и командам:</p>\n<ul>\n<li>Всем мейнтейнерам переводов и участникам сообщества, помогающим с переводом React более чем на 30 языков.</li>\n<li><a href=\"https://github.com/vuejs-jp\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Vue.js Japan User Group</a> — за идею контролировать перевод при помощи бота, и особая благодарность — <a href=\"https://github.com/potato4d\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Hanatani Takuma</a> за помощь в понимании их подхода, а также поддержку японского перевода.</li>\n<li><a href=\"https://github.com/smikitky\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Soichiro Miki</a> — за многочисленный <a href=\"https://github.com/reactjs/reactjs.org/pull/1636\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">вклад</a> и содержательные комментарии касательно всего процесса перевода, а также за помощь с поддержкой японского перевода.</li>\n<li><a href=\"https://github.com/ericnakagawa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Eric Nakagawa</a> — за организацию нашего предыдущего процесса перевода.</li>\n<li><a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Brian Vaughn</a> — за настройку <a href=\"/languages\">страницы переводов</a> и за администрирование всех поддоменов.</li>\n</ul>\n<p>И напоследок, огромное спасибо <a href=\"https://twitter.com/dan_abramov\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Дэну Абрамову</a> за то, что дал мне эту возможность, и, конечно же, за его замечательные наставления.</p>","excerpt":"Мы рады объявить о работе над поддержкой официальных переводов документации React на другие языки. Благодаря усердным усилиям сообщества React по всему миру, React переводится на более, чем 30 языков! Их можно найти на новой странице — переводы. Также, переводы для следующих трех языков уже полностью завершены! 🎉 Испанский: es.reactjs.org Японский: ja.reactjs.org Бразильский вариант португальского языка: pt-br.reactjs.org Отдельно хотелось бы поздравить Alejandro Ñáñez Ortiz, Rainer Martínez…","frontmatter":{"title":"А React уже переведён? ¡Sí! Sim! はい！","next":null,"prev":null,"author":[{"frontmatter":{"name":"Nat Alison","url":"https://twitter.com/tesseralis"}}]},"fields":{"date":"23 февраля, 2019","path":"content/blog/2019-02-23-is-react-translated-yet.md","slug":"/blog/2019/02/23/is-react-translated-yet.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"Introducing the New JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Release Candidate: No New Features"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}},{"node":{"frontmatter":{"title":"Building Great User Experiences with Concurrent Mode and Suspense"},"fields":{"slug":"/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html"}}},{"node":{"frontmatter":{"title":"Preparing for the Future with React Prereleases"},"fields":{"slug":"/blog/2019/10/22/react-release-channels.html"}}},{"node":{"frontmatter":{"title":"Introducing the New React DevTools"},"fields":{"slug":"/blog/2019/08/15/new-react-devtools.html"}}},{"node":{"frontmatter":{"title":"React v16.9.0 and the Roadmap Update"},"fields":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}}},{"node":{"frontmatter":{"title":"А React уже переведён? ¡Sí! Sim! はい！"},"fields":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}}},{"node":{"frontmatter":{"title":"React v16.8: The One With Hooks"},"fields":{"slug":"/blog/2019/02/06/react-v16.8.0.html"}}},{"node":{"frontmatter":{"title":"React v16.7: No, This Is Not the One With Hooks"},"fields":{"slug":"/blog/2018/12/19/react-v-16-7.html"}}}]}},"pageContext":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}},"staticQueryHashes":[]}