Working in English, Japanese and Spanish on one Mac
6 min read
Updated September 30, 2026
My workday runs in three languages. I work for Vercel, fully remote from Osaka for a company headquartered in San Francisco: Japanese with customers and partners, English with the global team. Spanish is my first language and one of the three I coach mahjong in. I was a frontend engineer before customer success and I still build sites, so code is in the mix too.
The conclusion, if you want to skip a lot of reading: two input sources are enough, most of the friction lives in the Japanese IME, and code should be in English no matter who reads it.
Two input sources are enough
Keep ABC and Japanese (Romaji), and nothing else. Spanish doesn’t need its own input source: the accents are dead keys on the ABC layout (see below), and a Spanish layout moves the brackets and symbols you type all day in code. With exactly two sources, the switching shortcut is a simple toggle.
Switching: Control-Space, Globe or Caps Lock
macOS gives you three ways to switch, all under System Settings > Keyboard.
- Control-Space goes back to the input source you used last. Hold Control and keep tapping Space to step through the list; Control-Option-Space goes to the next source in the Input menu.
- The Globe key (fn on keyboards without one) switches if you set “Press fn key to” (or the Globe key version of that menu) to Change Input Source.
- Caps Lock can toggle between Japanese and ABC. Under Text Input, click Edit and turn on “Use the Caps Lock key to switch to and from ABC” (the wording depends on your sources).
One conflict to know about: Control-Space is also the autocomplete shortcut in VS Code (and Cursor, which inherits its keybindings) and in JetBrains IDEs. The system shortcut wins, so the editor never sees it. Either turn off “Select the previous input source” under Keyboard Shortcuts > Input Sources and switch with the Globe key, or rebind autocomplete in the editor.
In the same Edit panel, “Automatically switch to a document’s input source” is worth turning on. macOS then remembers the input source per document, so the editor can stay in ABC while a chat window stays in Japanese.
Japanese IME settings worth changing
Open the Japanese settings from the Input menu in the menu bar.
Live Conversion (ライブ変換). It converts to kanji as you type, without pressing Space. It’s quick for chat and unpredictable for technical writing, where product names and API terms get rewritten while you’re still typing them. It’s a checkmark in the Input menu, so you can flip it without opening settings.
Full-width numeral characters. Turn it off, so numbers typed in Japanese mode come out half-width.
英数 and かな. On a JIS keyboard these two keys are one-way switches: 英数 always takes you to alphanumeric input and かな always to Japanese, so you never need to know which mode you were in. A US keyboard doesn’t have them. The built-in equivalents are Control-Shift-J for hiragana and Control-Shift-Apostrophe for the IME’s Romaji mode (enable that mode in the settings first). Many Japanese developers on US keyboards use Karabiner-Elements instead: its predefined Japanese rules turn a tap of left Command into 英数 and right Command into かな.
Fixing the wrong mode. You typed a word in Japanese mode and got ねxt. Before you press Return, Control-Semicolon turns the underlined text back into plain letters (next); Control-K makes it katakana and Control-J hiragana. F6 to F10 do the same jobs (you may need to hold fn). For text you’ve already confirmed, select it and press Control-Shift-R to get the candidates back.
Full-width characters in code
The Japanese IME types full-width versions of ASCII characters: the ideographic space (U+3000), ( ), :, ! and, if you let it, full-width digits. In Japanese prose that’s correct. In code it breaks things quietly.
- A full-width space is invisible, and only some tools treat it as whitespace. JavaScript accepts it; Python stops with “invalid non-printable character U+3000”; in a shell command it glues two words into one. ESLint’s
no-irregular-whitespace, which is in the recommended set, flags it outside strings. (where the syntax needs(gets you TypeScript’s “Invalid character” error.- In Markdown,
##followed by a full-width space isn’t a heading. It renders as literal text.
To find them in a repo (expect hits in Japanese copy; the ones in code are the bugs):
rg -n '[\x{3000}\x{FF01}-\x{FF5E}]' --type ts --type js --type css
For user input, normalize instead of rejecting:
"ABC123 456".normalize("NFKC") // "ABC123 456"
"〒530-0001".normalize("NFKC") // "〒530-0001"
"530ー0001".normalize("NFKC") // unchanged: ー is not a hyphen
That last line matters. In Japanese mode the hyphen key types ー, the long vowel mark, so postal codes and phone numbers arrive with it. NFKC leaves it alone, so replace it yourself.
Spanish accents on a US layout
On the ABC layout, accents are dead keys: press the combination, let go, then type the letter.
| Character | Keys |
|---|---|
| á é í ó ú | Option-E, then the vowel |
| ñ | Option-N, then N |
| ü | Option-U, then U |
| ¡ | Option-1 |
| ¿ | Option-Shift-/ |
Pressing and holding a letter also opens an accent menu, which is fine for the occasional word. The ABC Extended layout covers more accents for other Latin-script languages; it’s optional, and you don’t need it for Spanish.
Which language, with whom
A lot of my job is being the bridge: explaining the Japanese market to global teams in English, and working with Japanese customers in Japanese. What I go by:
- Per person, use the other person’s strongest language if you share it. Customers in Japan get Japanese even when their English is good; people say more, and say it more precisely, in their own language. That said, ask. Some people want to practice their English with you, and that’s their call.
- Per channel, one language. In a mixed channel, post the full message in each language instead of mixing them inside one.
- Speaking and writing are different. Plenty of people read English far better than they follow it at meeting speed. After an English call with Japanese participants, send a written summary.
English for code, commits and naming
Write identifiers, commit messages, branch names and PR titles in English, even on an all-Japanese team. The libraries, the error messages and the search results are in English, and sooner or later so is someone on the team. Comments and PR descriptions can be in the team’s language.
The hard part is business terms. Map them once and keep the list in the repo:
| Japanese | In code |
|---|---|
| 見積もり | quote |
| 請求書 | invoice |
| 発注 | purchaseOrder |
| 郵便番号 | postalCode |
| 都道府県 | prefecture |
| フリガナ | furigana |
When there’s no clean English word (フリガナ is one), use the romaji, consistently. The thing to avoid is three people inventing three translations for the same term.
The cost of switching mid-meeting
Every switch costs something, and switching in the middle of a thought costs the most. Decide the language of a meeting at the start, and switch at clear breaks: a recap in the other language at the end works better than alternating sentence by sentence.
Don’t be the interpreter and a participant at the same time. I do simultaneous interpretation on a live M.League broadcast, and interpreting takes all of your attention. If you also have to lead the discussion, you’ll do both worse; give one of the jobs to someone else, or plan for it.
Watch the numbers. Japanese counts in units of 10,000 (万) and 100 million (億), English in thousands and millions, and a Spanish billón is a million million, not an English billion. 10万 is 100,000; 1億 is 100 million. When a number matters, type it in the chat in digits instead of converting it out loud.
Japanese business email and chat, briefly
Email has a fixed shape: company and name with 様, お世話になっております, who you are, the point, and a closing line. Chat is shorter but not bare. Internal messages open with お疲れ様です; messages to customers, even in a shared Slack channel, open with お世話になっております.
株式会社〇〇
〇〇様
お世話になっております。〇〇の石原です。
本日はお時間をいただき、ありがとうございました。
次のステップを以下にまとめました。
1. 検証環境の準備(弊社、10月9日まで)
2. 要件のご確認(御社、10月14日まで)
ご確認いただけますと幸いです。
引き続きよろしくお願いいたします。
Put the point right after the greeting and give deadlines as dates, because 「来週中」 can mean a different day to each reader. Use 承知しました to acknowledge customers and managers; 了解しました reads as casual to many people. For the language side of keigo, see how I learned Japanese.
Set up the two input sources today, and give Live Conversion a week switched off before you decide you need it.