Announcement: Ending the tutorial translation project (for now)

In preparation for RedwoodJS’s long-anticipated v1 launch, we’re majorly restructuring the docs. Currently, the main docs live on and the tutorials live separately on with translations. After the restructure, the docs and tutorials will be reunited and their sources will move into the redwoodjs repo right alongside the code to make it easier for developers to update the docs as pull requests come in. In tandem with the docs restructure, we’ve decided to end the Tutorial translation project for the time being.


In January 2021, we embarked on a fun experiment to separate the infamous RedwoodJS tutorial from the main docs as a Docusaurus site and translate it into other languages via the Crowdin localization platform to reach a broader audience. Since then, 18 community members have volunteered their time and creative juices to begin translating the Tutorial Pt. 1 and Pt. 2 into 11 languages! Full translations for at least one of the tutorials were finished in French and Spanish and published to, where they’ve since been maintained. Many of the other languages were making steady progress towards release.

Why we’re ending the translation effort

There are several reasons we’ve decided to end the translation effort as we migrate to the new docs structure:

  1. Consolidating the docs and tutorials and moving them into the redwoodjs repo is a big infrastructural change that we want to focus on doing right—not to mention the fact that migrating the docs from to Docusaurus will take a little massaging.
  2. The tutorial received a major update in preparation for the v1 launch and much of that new content isn’t translated into our published languages yet. We don’t want the translated docs to be stale at launch.
  3. None of the main docs have been translated, which would’ve created a confusing user experience since the language-switcher dropdown would be showing nothing for most of the pages


The good news is we learned a ton from this experiment with Docusaurus and Crowdin, and we now have documentation and code examples to easily implement a localization process again in the future if so decided.

Crowdin synced with GitHub is very effective for automatically notifying translators when new strings have been added or modified in the source documents, and for making automatic pull requests to add translations to the repo. The translation infrastructure was entirely automated, aside from approving a pull request for the newly translated strings.

Did the translations drive traffic to our docs? French was our first target language for translating the tutorial, and France has continued to be the country with the second highest number of page views to after the United States. That said, the analytics visibility is currently limited to rolling 30 days and it is difficult to interpret the ROI here. In the future, having a more solid website analytics solution in place would help us better understand which languages should have more time and resource investment.

One other issue we had was that most languages only had one volunteer translator. This means a lot of languages were started but the translator, faced with a large volume of text, dropped the translation after putting an initial dent in it. Ideally there would be at least one more native proofreader for each language translated in order to get a final check before pushing to production. In the future, we could actively seek translators and ensure we have at least 4-5 translators for each language in order to ensure speed of delivery and reduce translation drop-off.


We cannot overstate our gratitude for the incredible contributions our community translators have volunteered and will be sending them each a thank you gift (contact @thedavid with your email if you haven’t already!). We’ll keep the existing translations archived here in case anyone would like to browse translations of older snapshots of the tutorial

:tada::mechanical_arm: Kudos to our amazing community translators :mechanical_arm::tada:

  • derkanadier (French, Italian)

  • luispinto23 (Brazilian Portuguese)

  • mlabate (Italian)

  • oguzhnatly (Turkish)

  • malitov (Ukrainian, Russian)

  • pdejuan (Italian, Spanish)

  • renansoares (Brazilian Portuguese)

  • corlaez (Spanish)

  • brian.gastesi (Spanish)

  • bugsfunny (French)

  • pachoclo (Spanish)

  • MarkDuLJ (Simplified Chinese)

  • mricanho (Spanish)

  • noire.munich (French)

  • Krankypanky (German)

  • simoncrypta (French)

  • *Thieffen (French)

*Special callout to Thieffen, who was our pioneer translator and single handedly translated the 18,000 word Tutorial Pt.1 into French :baguette_bread:


This is simply :exploding_head:

I’m amazed at what this project became. And also so grateful for the community of contributors that made it possible. You all helped Redwood go to new places and new people — thank you :pray:

@clairefro without you this project would never have seen the light of day. You not only brought vision, but you also took this from proof of concept to MVP to scaling across translations. Then you created a community of contributors from across the globe. Well done! I consider everything about this a success. Most of all, we’ve learned so much from you and from this project.

@Thieffen @renansoares @noire.munich @simoncrypta and every other translator who gave time and effort to this project, thank you for living and modeling the culture of RedwoodJS — “by helping others be successful with Redwood, we make Redwood successful.” All of helped make this true, one translation at a time. Thank you! (And keep a lookout for a message from me soon!)

1 Like

Thanks a lot @clairefro ( and community translators \o/ ), what’s ahead for this project is great and I’m happy to see it coming back stronger :+1: