August 13, 2026
i18n
Originally, the Web Scraper extension was only available in English. English is only the third most spoken native language in the world, with 372 million native speakers, while Spanish has 487 million and Chinese has 988 million. To improve usability and reduce misuse, we decided to internationalize the Web Scraper extension. The initial plan was to use a SaaS, but in the end, everything was translated by AI.
Why is translating software important? #
The Chrome extension developer dashboard provides information about user count per country. Using this information, we can calculate how many Web Scraper extension users there are per million people. In native English-speaking countries like the United States, the United Kingdom, and Australia, there are 350+ users per million people, while in countries like Italy and Japan, where English adoption is only 28%, the user count is 200 - 250. From our analysis, English adoption in a country correlates with the user count per million people. See the table below for more examples.
Initial SaaS approach #
Initially, we decided to use a SaaS to perform the translations. We created scripts that would synchronize our string file with their system. There we could initialize languages and translate them via machine translation, AI, or hire human professionals. We started with Latvian, since it is the language our entire team speaks. Latvian is a lot more complex than English: a word can have a gender and up to seven different endings. In a sentence, this means that when multiple words are combined, they have to take specific endings or the sentence doesn't make any sense at all. The initial machine and AI translations were bad or inconsistent. Machine translation would mix up the word endings, and AI got them right only about half the time (at that point, we were using Opus 4.8). In the end, we decided to use human translators.
Example of Latvian language endings:
SaaS AI setup
For AI, good context is sometimes what makes or breaks the result, and for i18n it is essential. We set up the context both to try out the AI feature and to remove any ambiguity for human translators, who still use AI and machine translation as a starting point. Here is what we set up:
SaaS human professional translation
After everything was set up, we tested human translation for Latvian and German. The translator first translated the dictionary, then kept adding new words to it during the translation. When the translated strings came back and we started checking them, we found that while the translations were fluent, the tone was inconsistent, and there were some incorrect translations when an English word was ambiguous. As a result, we weren't 100% satisfied.
The switch to 100% AI #
While we were testing professional human translation, a lot was happening in the AI world: the Fable model launched, and OpenRouter announced Fusion, which combines three models to score even higher on benchmarks than Fable. We had to try it. We didn't have access to this in the SaaS platform, so we built this setup locally. The AI translation was iterative work, where each step was redone because of new learnings or changes in previous steps. Here are the steps we performed, some of them multiple times.
Original English strings
While we were happy with our original strings, after creating the tone definition we tasked AI with reviewing them and suggesting better wording. It did, and we made a few changes.
String descriptions
When we first tested AI, there were a lot of ambiguous translations, so we added descriptions to the problematic strings. This steered the translations in the right direction. It was also essential to note when a string is a button label and should be kept as short as possible. For the final version, we tasked AI with going through the entire source code and adding a description for every string. After a manual review, about 10 out of 300 descriptions were adjusted.
Tone
Initially, the tone definition stated that professional IT language should be used and listed the words that shouldn't be translated. After comparing AI and human translations, we tasked AI with updating the definition, giving it examples of the translations we liked better - "X should be translated like this, not like that."
English dictionary
A dictionary is essential because it pins one word to one translation and removes any ambiguity. Initially, it contained web scraping specific words that were being translated into Latvian incorrectly. After the first iteration of AI translation, we tasked AI with adding more words that were ambiguous in other languages. The dictionary grew a lot.
Dictionary translations
The dictionaries were translated with a script that used OpenRouter's Fusion model. The translations were redone multiple times as the English dictionary and the tone definition changed.
Machine translated strings
As an additional input, we translated all strings in all languages with machine translation. The hope was that if AI missed something, machine translation could provide extra context.
String translations
String translations were performed with a script that took:
Using the Fusion model, the strings were translated multiple times as the inputs changed.
AI vs Human results #
After setting up the tone and dictionaries and iterating on the AI translations with the Fusion model, there were no incorrect word endings - a good signal that the playing field had become a lot more equal. We compared AI against a human translator for Latvian and German.
Most human mistakes came from misunderstanding the English string or drifting away from the desired tone. For AI, there were no clear bad patterns; sometimes we simply felt that the human translation was better, even though the AI translation was still good enough.
As you can see, there is no clear winner and no clear loser.
After the final AI translation, we ran one more human translation test, this time giving the professional translator access to our AI translations: they only had to fix issues or keep the translation as is. We did this for the French language. Out of the 307 test strings, 228 were kept as is. Since no one on our team is a native French speaker, we turned to AI to perform the final review. Here are some of the results:
Here is the verdict from the AI comparison:
Bottom line: the AI set is the stronger translation overall - it won 60 of 79 rows in a blind multi-agent review, and 27 of the 30 verified critical defects belong to the human set. But the human set is systematically right about one important thing the AI gets wrong everywhere: TONE.md's rule that guidance text must use the imperative. The best French locale would be the AI set with roughly a dozen targeted fixes borrowed from the human's approach.
Final thoughts #
Top-tier AI models can compete with human translators, and AI translation can be done without making bad errors. As of writing this, newer and better AI models have already rolled out - and they can only improve from here.
Using human translators would have cost us $7,500, while we spent about $1,500 on AI tokens - and we would have spent half of that if an article like this one had existed. Our initial plan was to use human translators for the base translation and machine translation for new strings, since having 10 new strings translated by professionals on every release would be too time consuming and too costly. With high quality AI translations, this is no longer a problem at all.
In the end, we had human translations for Latvian, German, French, and Spanish, but we decided to stick with AI-only translations, since we feel this is where things are heading anyway.
Notes for your AI #
Since this article will probably end up as input for somebody's AI, here is our tone definition, which you can use as a starting point: