Skip to content
[010]2026.04.12log

"今すぐ始める" Wasn't Japanese

Same button, different language — on the 30% that translation can't reach

Takeaway: "Building in another country isn't translating the blueprint. It's understanding which way the wind blows in that neighborhood."


The Korean site was running, so the Japanese site should be quick. Same house, one more copy. Just change the wallpaper, right?

I opened my laptop that evening and got to work. The plan was simple. Clone the Korean site, swap the text to Japanese, deploy. Two days, I figured.

The first wall was technical.

Building a multilingual site requires setting up something called i18n. Short for internationalization—there are 18 letters between the "i" and the "n." I don't know who came up with that, but the development world is full of names like this.

In Next.js, multilingual routing uses a library called next-intl. Visit /ko and you get Korean. Visit /ja and you get Japanese. Sounds simple when described.

But grafting this onto an existing site broke the routing. Pages wouldn't load, or loaded in Korean regardless, or returned 404s. A reunion with red text. Send the error to the control tower, apply the fix, encounter a different error. The same cycle as the toggle incident in EP.05.

The routing issue was eventually resolved. But once resolved, a second wall appeared.

Inside the Korean site's components—the building blocks of the interface—Korean text was directly embedded. Rather than pulling text from translation files, phrases like "무료로 시작하기" (Start for free) and "채널을 등록하세요" (Register a channel) were written directly in the code.

The problem: no matter how much I changed the translation files, the screen wouldn't reflect it. The translation file says "put Japanese here," but the code itself says "put Korean here" and won't budge.

When building the Korean-only site, this wasn't an issue. Korean was all we'd ever need. But the moment a second language entered the picture, "a structure that never considered multilingual support" was exposed. The same pattern as the V2-to-V3 refactoring in EP.02. Works fine under one condition; change the condition and structural flaws surface.

I opened components one by one, replacing hardcoded Korean with translation keys. Changed "무료로 시작하기" to t('cta.start_free'), then added Korean and Japanese entries in the respective translation files. Tedious but necessary.

With the technical and structural problems solved, Japanese text began appearing on screen. That's when the third wall appeared.

This one wasn't about technology. It was about feel.

Something was off. Japanese was displaying. Grammar was correct. Words were accurate. But if a Japanese person saw this site, it would look like a foreign service that had been translated—not a service built for them. It would look unprofessional.

I tried to identify why. The sentences were correct. Why did they feel wrong?

The Korean CTA was "지금 시작하기"—"Start now." Translated to Japanese: 「今すぐ始める」. Same meaning. But when I looked at what Japanese SaaS sites actually use, it was different. More polite. More explanatory. More careful. 「まずは無料でお試しください」—"Please try it for free first." In Korean, "start" is natural. In Japanese, "please try" is natural.

It wasn't just UI text. The way features were described differed. The Korean site summarized features in three lines and placed a CTA button immediately after. Japanese sites provide more context when explaining a single feature. Why is this feature needed? In what situation would you use it? How is it different from alternatives? Text volume commonly exceeded Korean by 30% or more.

The master plan had already stated this. "Translation ≠ localization." "Japan: politeness + detailed explanation + high polish. UI text may be 30%+ longer than Korean." I thought I understood when I read it. But looking at the screen and feeling "this is a translation, not a Japanese service" was a different kind of understanding.

I can use Japanese at a business level. The master plan notes this as an asset AI translation can't replace. But "being able to speak Japanese" and "being able to build a service that feels comfortable to Japanese users" turned out to be different capabilities. The former is language proficiency. The latter is cultural intuition.

I ended up reworking the translation files from scratch. Not converting Korean to Japanese, but thinking about what words should exist on a Japanese site from the beginning, and writing accordingly. Same features, different explanations. Same buttons, different copy. Same structure, different volume and tone.

It took considerably longer than expected. Started with "two days should be enough." It wasn't two days.

But through this process, I learned one thing clearly. Putting a service in another country isn't building another copy of the same house. It's building a different house suited to that neighborhood's climate and customs. Not translating the blueprint—redrawing it.

「今すぐ始める」is grammatically perfect Japanese. But it wasn't Japanese.


🔧 Technical Terms in This Episode

i18n (Internationalization) The process of making software usable in multiple languages. Abbreviated as i18n because there are 18 letters between the "i" and "n" in "internationalization."

next-intl A library for building multilingual sites in Next.js. Configures routing so that /ko serves Korean and /ja serves Japanese.

Routing Determining which page to display based on the URL. When /ja is requested, route to the Japanese page.

Component An independent building block of the interface. Like LEGO pieces—header components, button components, and card components are assembled to create full pages.

Hardcoding Fixing values directly in code. Writing "Start for free" directly in a component instead of pulling it from a translation file. Hardcoded text requires modifying the code itself to change languages, making it fatal for multilingual support.

Translation Key An identifier used to retrieve text from translation files. Writing t('cta.start_free') pulls "무료로 시작하기" from the Korean file and 「まずは無料でお試しください」 from the Japanese file. One codebase, different text per language.

Localization (l10n) Not mere translation, but adjusting the entire service to match local culture, customs, and expectations. The same CTA button should read "시작하기" (Start) in Korean and 「まずはお試しください」 (Please try first) in Japanese. Includes not just text but layout, explanation depth, and tone.