Skip to content

Add Korean (ko) translation for Android and iOS - #821

Open
maxbitcoiner wants to merge 10 commits into
ACINQ:masterfrom
maxbitcoiner:translate_ko
Open

Add Korean (ko) translation for Android and iOS#821
maxbitcoiner wants to merge 10 commits into
ACINQ:masterfrom
maxbitcoiner:translate_ko

Conversation

@maxbitcoiner

@maxbitcoiner maxbitcoiner commented Jul 27, 2026

Copy link
Copy Markdown

Adds a Korean localization covering both apps.

Scope

Target Strings
values-ko/important_strings.xml 333
values-ko/strings.xml 730
Localizable.xcstrings 1310
Currencies.xcstrings 156
InfoPlist.xcstrings 5
ko.lproj/about.html, ko.lproj/liquidity.html 2 files

ko is registered in knownRegions and both HTML files are added to their variant groups.

Following the guidelines

  • important_strings.xml was done first, as requested
  • Strings with translatable="false" (45) and the lorem ipsum placeholders are left untouched
  • %1$s / %@ / %lld keep their numbering; %% is preserved
  • Apostrophes are escaped; <b>, <i> and <a href> markup is kept
  • Newlines and leading/trailing whitespace match the source
  • No keys added, removed or reordered

Terminology

Technical terms stay in English where a Korean rendering would be less clear than the original, which is also what the French translation does: swap, splice, BOLT, Tor, Electrum, LSP, LNURL, Taproot, Preimage.

Terms that are well established in Korean are translated: 비트코인 (bitcoin), 라이트닝 (Lightning), 온체인 (on-chain), 시드 (seed), 채널 (channel), 유동성 (liquidity), 자동 채널 관리 (automated channel management), 복구 문구 (recovery phrase).

Android and iOS share wording wherever they share an English string, so the two apps read the same.

Notes for reviewers

Translated with the UI context in hand: each key was matched against its usage in the Kotlin/Swift sources (screen, widget type, surrounding code) so that buttons read as buttons and error messages read as full sentences. Around 87% of strings could be traced to a call site; the rest were resolved from the key name and the developer comment.

I maintain the Korean translations for several Bitcoin projects on Transifex, so the terminology here is consistent with what Korean users already see elsewhere in the ecosystem:

Happy to adjust any wording you'd prefer differently.

Translate all 333 strings in important_strings.xml, the file ACINQ
flags as the translation priority.

Terminology follows existing conventions in the codebase:
- Protocol/product names kept in Latin (swap, splice, BOLT, Tor,
  Electrum, LSP), matching the French translation's approach
- liquidity -> 유동성, inbound liquidity -> 수신 유동성
- automated channel management -> 자동 채널 관리
- recovery phrase -> 복구 문구

All placeholders (%1$s, %2$s, %%), HTML markup (<b>, <a href>),
newlines and escaped apostrophes are preserved. strings.xml is
copied as-is for now and falls back to English until translated.
Complete the Android localization by translating the remaining 730
translatable strings in strings.xml.

Following the guidelines:
- Strings marked translatable="false" (45) are left untouched
- The lorem ipsum placeholders (2) are left untouched
- Protocol and brand names stay in English (Bolt11/Bolt12, Tor,
  Electrum, LNURL, Taproot), as do symbols and units
- All %1$s/%2$s placeholders keep their numbering, %% is preserved,
  apostrophes are escaped, and <b>/<i>/<a href> markup is kept

Android localization is now complete: 1063 strings across both files.
Register Korean in the Xcode project and translate the localized
resources that live outside the string catalogs:

- Add ko to knownRegions
- Add ko.lproj/about.html and ko.lproj/liquidity.html, registered in
  the corresponding variant groups (HTML markup, links and <b>
  emphasis are preserved)
- Translate InfoPlist.xcstrings (permission prompts); CFBundleName
  stays "Phoenix"

The string catalogs themselves (Localizable/Currencies) are handled
separately since they carry every language in a single file.
Translate 840 of the 1310 strings in the iOS string catalog.

Terminology matches the Android translation: protocol and product
names stay in English (swap, splice, BOLT, Tor, Electrum, LSP),
liquidity is 유동성, automated channel management is 자동 채널 관리,
and recovery phrase is 복구 문구.

Format placeholders (%@, %1$@, %lld) keep their positional numbering
as used by the English source. Remaining strings fall back to English
until translated.
Translate the remaining 190 strings, bringing the iOS string catalog
to full Korean coverage (1310 strings).

Placeholders follow whatever the English source uses: positional
(%1$@, %2$@) where the source is positional, plain %@ otherwise.
Markdown emphasis and newlines are preserved.
Add Korean names for all 156 entries in the currency catalog. These
appear in the fiat currency picker and are also used by its search
field, so Korean names let users search in their own language.

Includes the four exchange-rate descriptors (black/blue/free market,
official rate) alongside the currency names.
Review all 2479 translated strings and apply 53 improvements:

- Fix meaning errors: "Bolt12 코드를 이름에 연결" reversed the direction
  of the original ("link a code to a name"); "송금" narrowed the sense
  of outgoing payment
- Drop literal English constructions: "~하는 유일한 방법은 ~것입니다",
  "함께 작동하는", "충돌에 따라 이루어졌습니다"
- Fix grammar: "확인된 후까지" is not idiomatic Korean
- Follow Korean conventions: "&" reads as "및", warnings work better as
  full sentences ("수수료율이 낮습니다!"), status labels take the
  completed form ("브로드캐스트됨")
- Remove redundancy: "온체인 수수료를 충당하기 위한 비용", "기기의 설정"

Placeholders, HTML markup, newlines and escaping are unchanged.
A cross-platform audit found 49 English strings that had been given
different Korean translations depending on where they appeared. Since
Android and iOS share most of their wording, these now match.

Notable fixes:
- "Outgoing" was alternating between 발신 and 송신 across payment type
  labels; standardised on 발신
- Transaction/Total/Redeem/Support/Preimage/Mutual were translated
  differently on each platform
- Swap-in/Swap capitalisation was inconsistent
- Warnings and error messages now consistently use full sentences

Link and Privacy intentionally keep separate translations: they appear
in genuinely different contexts (URL label vs verb, policy link vs
LNURL-auth explanation vs settings entry).
A second audit covering strings of any length (the earlier pass only
looked at short labels) found 27 sentences that Android and iOS
translated differently despite sharing the same English source.

Also fixes one placeholder particle: %2$@를 becomes %2$@을(를), since
the substituted value may end in either a vowel or a consonant.

Only "Link" and "Privacy" still differ per platform, which is correct:
they appear in different contexts (URL label vs verb; policy link vs
LNURL-auth explanation vs settings entry).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant