{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2019/02/23/is-react-translated-yet.html","result":{"data":{"markdownRemark":{"html":"<p>We’re excited to announce an ongoing effort to maintain official translations of the React documentation website into different languages. Thanks to the dedicated efforts of React community members from around the world, React is now being translated into <em>over 30</em> languages! You can find them on the new <a href=\"/languages\">Languages</a> page.</p>\n<p>In addition, the following three languages have completed translating most of the React Docs! 🎉</p>\n<ul>\n<li><strong>Spanish: <a href=\"https://es.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">es.reactjs.org</a></strong></li>\n<li><strong>Japanese: <a href=\"https://ja.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ja.reactjs.org</a></strong></li>\n<li><strong>Brazilian Portuguese: <a href=\"https://pt-br.reactjs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pt-br.reactjs.org</a></strong></li>\n</ul>\n<p>Special congratulations to <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>, and all the contributors to the Spanish translation for being the first to <em>completely</em> translate the core pages of the docs!</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>Why Localization Matters </h2>\n<p>React already has many meetups and conferences around the world, but many programmers don’t use English as their primary language. We’d love to support local communities who use React by making our documentation available in most popular languages.</p>\n<p>In the past, React community members have created unofficial translations for <a href=\"https://github.com/discountry/react\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chinese</a>, <a href=\"https://wiki.hsoub.com/React\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Arabic</a>, and <a href=\"https://github.com/reactjs/ko.reactjs.org/issues/4\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Korean</a>; by making an official channel for these translated docs we’re hoping to make them easier to find and help make sure that non-English-speaking users of React aren’t left behind.</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>Contributing </h2>\n<p>If you would like to help out on a current translation, check out the <a href=\"/languages\">Languages</a> page and click on the “Contribute” link for your language.</p>\n<p>Can’t find your language? If you’d like to maintain your language’s translation fork, follow the instructions in the <a href=\"https://github.com/reactjs/reactjs.org-translation#starting-a-new-translation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">translation repo</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>Backstory </h2>\n<p>Hi everyone! I’m <a href=\"https://twitter.com/tesseralis\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Nat</a>! You may know me as the <a href=\"https://www.youtube.com/watch?v=Ew-UzGC8RqQ\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">polyhedra lady</a>. For the past few weeks, I’ve been helping the React team coordinate their translation effort. Here’s how I did it.</p>\n<p>Our original approach for translations was to use a SaaS platform that allows users to submit translations. There was already a <a href=\"https://github.com/reactjs/reactjs.org/pull/873\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pull request</a> to integrate it and my original responsibility was to finish that integration. However, we had concerns about the feasibility of that integration and the current quality of translations on the platform. Our primary concern was ensuring that translations kept up to date with the main repo and didn’t become “stale”.</p>\n<p><a href=\"https://twitter.com/dan_abramov\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Dan</a> encouraged me to look for alternate solutions, and we stumbled across how <a href=\"https://vuejs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Vue</a> maintained its translations — through different forks of the main repo on GitHub. In particular, the <a href=\"https://jp.vuejs.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Japanese translation</a> used a bot to periodically check for changes in the English repo and submits pull requests whenever there is a change.</p>\n<p>This approach appealed to us for several reasons:</p>\n<ul>\n<li>It was less code integration to get off the ground.</li>\n<li>It encouraged active maintainers for each repo to ensure quality.</li>\n<li>Contributors already understand GitHub as a platform and are motivated to contribute directly to the React organization.</li>\n</ul>\n<p>We started off with an initial trial period of three languages: Spanish, Japanese, and Simplified Chinese. This allowed us to work out any kinks in our process and make sure future translations are set up for success. I wanted to give the translation teams freedom to choose whatever tools they felt comfortable with. The only requirement is a <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/PROGRESS.template.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">checklist</a> that outlines the order of importance for translating pages. </p>\n<p>After the trial period, we were ready to accept more languages. I created <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/create.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">a script</a> to automate the creation of the new language repo, and a site, <a href=\"https://isreacttranslatedyet.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Is React Translated Yet?</a>, to track progress on the different translations. We started <em>10</em> new translations on our first day alone!</p>\n<p>Because of the automation, the rest of the maintenance went mostly smoothly. We eventually created a <a href=\"https://rt-slack-invite.herokuapp.com\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Slack channel</a> to make it easier for translators to share information, and I released a guide solidifying the <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/maintainer-guide.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">responsibilities of maintainers</a>. Allowing translators to talk with each other was a great boon — for example, the Arabic, Persian, and Hebrew translations were able to talk to each other in order to get <a href=\"https://en.wikipedia.org/wiki/Right-to-left\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">right-to-left text</a> working!</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>The Bot </h2>\n<p>The most challenging part was getting the bot to sync changes from the English version of the site. Initially we were using the <a href=\"https://github.com/vuejs-jp/che-tsumi\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">che-tsumi</a> bot created by the Japanese Vue translation team, but we soon decided to build our own bot to suit our needs. In particular, the che-tsumi bot works by <a href=\"https://git-scm.com/docs/git-cherry-pick\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">cherry picking</a> new commits. This ended up causing a cavalade of new issues that were interconnected, especially when <a href=\"/blog/2019/02/06/react-v16.8.0.html\">Hooks were released</a>.</p>\n<p>In the end, we decided that instead of cherry picking each commit, it made more sense to merge all new commits and create a pull request around once a day. Conflicts are merged as-is and listed in the <a href=\"https://github.com/reactjs/pt-BR.reactjs.org/pull/114\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">pull request</a>, leaving a checklist for maintainers to fix.</p>\n<p>Creating the <a href=\"https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/sync.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">sync script</a> was easy enough: it downloads the translated repo, adds the original as a remote, pulls from it, merges the conflicts, and creates a pull request.</p>\n<p>The problem was finding a place for the bot to run. I’m a frontend developer for a reason — Heroku and its ilk are alien to me and <em>endlessly</em> frustrating. In fact, until this past Tuesday, I was running the script by hand on my local machine!</p>\n<p>The biggest challenge was space. Each fork of the repo is around 100MB — which takes minutes to clone on my local machine. We have <em>32</em> forks, and the free tiers of most deployment platforms I checked limited you to 512MB of storage. </p>\n<p>After lots of notepad calculations, I found a solution: delete each repo once we’ve finished the script and limit the concurrency of <code class=\"gatsby-code-text\">sync</code> scripts that run at once to be within the storage requirements. Luckily, Heroku dynos have a much faster Internet connection and are able to clone even the React repo quickly.</p>\n<p>There were other smaller issues that I ran into. I tried using the <a href=\"https://elements.heroku.com/addons/scheduler\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Heroku Scheduler</a> add-on so I didn’t have to write any actual <code class=\"gatsby-code-text\">watch</code> code, but it end up running too inconsistently, and I <a href=\"https://twitter.com/tesseralis/status/1097387938088796160\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">had an existential meltdown on Twitter</a> when I couldn’t figure out how to send commits from the Heroku dyno. But in the end, this frontend engineer was able to get the bot working!</p>\n<p>There are, as always, improvements I want to make to the bot. Right now it doesn’t check whether there is an outstanding pull request before pushing another one. It’s still hard to tell the exact change that happened in the original source, and it’s possible to miss out on a needed translation change. But I trust the maintainers we’ve chosen to work through these issues, and the bot is <a href=\"https://github.com/reactjs/reactjs.org-translation\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">open source</a> if anyone wants to help me make these improvements!</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>Thanks </h2>\n<p>Finally, I would like to extend my gratitude to the following people and groups:</p>\n<ul>\n<li>All the translation maintainers and contributors who are helping translate React to more than thirty languages.</li>\n<li>The <a href=\"https://github.com/vuejs-jp\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Vue.js Japan User Group</a> for initiating the idea of having bot-managed translations, and especially <a href=\"https://github.com/potato4d\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Hanatani Takuma</a> for helping us understand their approach and helping maintain the Japanese translation.</li>\n<li><a href=\"https://github.com/smikitky\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Soichiro Miki</a> for many <a href=\"https://github.com/reactjs/reactjs.org/pull/1636\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">contributions</a> and thoughtful comments on the overall translation process, as well as for maintaining the Japanese translation.</li>\n<li><a href=\"https://github.com/ericnakagawa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Eric Nakagawa</a> for managing our previous translation process.</li>\n<li><a href=\"https://github.com/bvaughn\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Brian Vaughn</a> for setting up the <a href=\"/languages\">languages page</a> and managing all the subdomains.</li>\n</ul>\n<p> And finally, thank you to <a href=\"https://twitter.com/dan_abramov\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Dan Abramov</a> for giving me this opportunity and being a great mentor along the way.</p>","excerpt":"We’re excited to announce an ongoing effort to maintain official translations of the React documentation website into different languages. Thanks to the dedicated efforts of React community members from around the world, React is now being translated into over 30 languages! You can find them on the new Languages page. In addition, the following three languages have completed translating most of the React Docs! 🎉 Spanish: es.reactjs.org Japanese: ja.reactjs.org Brazilian Portuguese: pt-br…","frontmatter":{"title":"Is React Translated Yet? ¡Sí! Sim! はい！","next":null,"prev":null,"author":[{"frontmatter":{"name":"Nat Alison","url":"https://twitter.com/tesseralis"}}]},"fields":{"date":"February 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":"Is React Translated Yet? ¡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":[]}