Launching airbnb.jp in record time

By Jason Katz-Brown

Airbnb has hosts in 192 countries, and two-thirds of Airbnb trips cross a country border. Being totally international is not optional for us! Many things contribute to Airbnb growing in a new part of the world: an enthusiastic community of hosts, a natively-translated website and mobile apps, locally relevant search ranking, local payment methods, multilingual customer support, and lots more.

In this post, I’ll walk through the life of airbnb.jp, our Japan website.

Prioritization

Late last year, actor/investor Ashton Kutcher and Airbnb CEO Brian Chesky made a last minute trip to meet the growing Airbnb community in Tokyo. Having lived in Tokyo for 3 years, I found this news quite exciting, but Airbnb didn’t yet have a Japanese website! Brian and Ashton’s visit was happening in one week — could we launch airbnb.jp in time?

Airbnb’s websites and mobile apps have 400,000 words of English content. We couldn’t translate all of it to Japanese in just a few days. It was important to prioritize so that the most visible webpages, email templates, and core flows of the site were delightfully localized before launch.

We set up our translation infrastructure so everything goes through one t() method on our Rails server. For example:

t('emails.reference_request.title', :default => 'Write %{username} a reference on Airbnb', :username => @current_user.first_name)

We instrument t() to help us know how to prioritize phrases for translation:

  1. In the case of responding to a web request, if we have never seen this phrase translated in the context of the current request’s controller/action, we associate this phrase with the current request’s controller/action or email template. For example, a new phrase on the listing page is associated with the “rooms#show” controller/action pair.
  2. We increment a per-day, site-wide count each time a controller/action pair is requested or an email is sent. This is done by incrementing an in-memory counter, then periodically flushing counts over UDP to a server which aggregates and stores counts per key in Redis.

Altogether, this allows us to present Japanese translators with a view of all pages/emails on our site, and order pages by translation completeness in Japanese and visibility (the ‘importance’ column represents the # of page views in the last 4 days):

phrase-tool

To get the most important parts of airbnb.jp translated, we just had to instruct translators to start at the top of this list of pages/emails and work their way down.

Many features have evolved on Airbnb since its inception 5 years ago, so we show translators only phrases that have had t() called on them in the last 4 days. To make this possible, t() increments a count of how many times the phrase has been translated today. This ensures that translators are only translating text that users are actually going to see.

Context

In addition to associating each phrase with the controller/action pair or email template, t() captures the HTML of the response and asynchronously sends it to a server running a headless browser to take a screenshot. The goal is to have a screenshot of each phrase on each page it appears on, so that the translator knows exactly the context the phrase is used in. Here, while translating the phrase “never,” a translator can see that it is used to describe when the host last updated their availability calendar:

screenshot-tool

We also give translators a contextual translation tool. This lets them edit translations while using the site:

contextual-translation-tool

This tool works by making t() wrap its return value in <phrase id=…>…</phrase> and then instrumenting these tags with JavaScript. After airbnb.jp went live the night of Ashton and Brian’s visit, our community translators were able to spiff it up in-place with this tool.

Content rendered client-side is naturally much harder to screenshot or instrument on the server. (We call t() on the server and then render the translations in JavaScript with our own Polyglot.js library.) For content rendered client-side, and for our mobile apps, we don’t have screenshots and can’t edit translations in-line. So there is no substitute for manually poring over the apps to find translation problems.

Instant turnaround

We’ve further instrumented t() to automatically queue phrases for translation. If the phrase key (emails.reference_request.title in the above example) does not exist in our phrases database, t() creates a new row in our phrases database. This ensures that new content on the site is instantly translatable.

Furthermore, when a translator changes a translation, it updates a site-wide per-locale timestamp. Every time an Airbnb translator or employee makes a request, the Rails server checks if this timestamp is more recent than its in-memory copy of translations for the request’s locale. If there is a new version of translations to download, it grabs them from the translations database before responding to the request. So if a translator makes a change to airbnb.jp, they will see their improvements live immediately. This lets us iterate on translations as fast as feedback comes in.

People

In addition to all these tools, we needed to find Japanese translators pronto! As always, relying on our awesome community of Airbnb hosts was our first choice. Initially a host in Tokyo and a friend of a friend in San Francisco were keen to help, and we’ve expanded the community from there. It is wonderful for community members who have actually traveled or hosted on Airbnb to provide the voice that introduces Airbnb to Japan. Our community members know our service best and are passionate about making Airbnb accessible in their respective language — and just like professional translators, we pay them for their services by the word for their kind help. (We were excited to meet one of them at Airbnb headquarters recently :)

Future

Airbnb is off to a great start in Japan. Listings in Tokyo alone have grown over 180% from this time last year. There is of course still much to do help Airbnb grow in Japan. For example, the bounce rate of visitors to airbnb.jp is twice that of airbnb.fr. We can do a better job educating Japanese users how and why to use Airbnb, and improve the homepage so it’s easier to browse popular destinations in Asia.

In April I attended our second community event in Tokyo, which maxed out its 500-person capacity. I stayed with absolutely delightful hosts and was blown away by our Japanese community’s energy, passion, and diversity. They inspire me to continue making Airbnb truly international and radically local.


Check out all of our open source projects over at airbnb.io and follow us on Twitter: @AirbnbEng + @AirbnbData


Originally published at nerds.airbnb.com on September 16, 2013.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.